[SQL Server/SQL]Cascade Delete Foreign Keys

Pagina: 1
Acties:
  • 150 views sinds 30-01-2008
  • Reageer

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

Topicstarter
Goeiemorgen allemaal,

Ik heb een zwaar gevecht met SQL Server 2000 en ik kom er niet helemaal uit.

Ik heb 3 tabellen voor een poll, een met user gegevens... een met de gegevens uit de poll en een om te controleren of de user al gestemt heeft.

Die 3e tabel, is dus een koppeltabel met 2 foreign keys (userID en PollID)..

Nu wil ik, zowel als een user en als een Poll verwijderd wordt, dat de votes van die user, of alle votes van die poll ook verwijderd worden.

Dit zou moeten kunnen met Cascade Delete. Nu kan ik een van de twee tabellen (poll of User) koppelen met Cascade Delete naar de koppeltabel, maar als ik de ander dan ook wil koppelen met Cascade Delete. dan geeft ie de volgende error:

De volgende fout is opgetreden: Introducing FOREIGN KEY constraint 'FK_User_Poll_WhoHasVoted' on table 'poll_whohasvoted' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints

Nu heb ik al gezocht op andere fora en daar zeiden ze dat er triggers gebruikt meosten worden (daar ga ik dan wel mee prutsen als het moet) maar ik zou graag zien dat het wel werkt (natuurlijk :D)..

Kan dit gewoon niet.. is het niet mogelijk om twee cvascade deletes naar een kolom te doen of klopt er gewoon iets niet in de manier waarop ik de relatie probeer te leggen

Jasper

-edit-
Onder ander hier zeggen ze dat

Het gaat mij er ook niet om dat de vote verloren gaat als de user verwijderd wordt, dat is een andere discussie :)

[ Voor 10% gewijzigd door Jaspertje op 10-10-2003 10:29 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Op welke tabel leg je je Foreign key constraint? Toch op die koppeltabel?
Toon eens de SQL code waarmee je die FK creeërt.

Je kan dit inderdaad ook implementeren met Triggers, maar in SQL Server 2000 hebben ze nu die cascading actions geintroduceerd, en dat geniet toch wel de voorkeur.

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

Topicstarter
Hiermee worden de relaties aangemaakt

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL = "ALTER TABLE Poll_WhoHasVoted ADD " & _
        "CONSTRAINT [FK_Poll_Poll_Poll_WhoHasVoted] FOREIGN KEY " & _
        "(" & _
            "[PollID]" & _
        ") REFERENCES Poll_Poll(" & _
            "[PollID]" & _
        ") ON DELETE CASCADE"
Conn.Execute(SQL)

SQL = "ALTER TABLE Poll_WhoHasVoted ADD " & _
        "CONSTRAINT [FK_Users_Poll_WhoHasVoted] FOREIGN KEY " & _
        "(" & _
            "[UserID]" & _
        ") REFERENCES Users(" & _
            "[UserID]" & _
        ") ON DELETE CASCADE"
Conn.Execute(SQL)

[ Voor 69% gewijzigd door Jaspertje op 10-10-2003 10:38 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je moet toch de constraints aanmaken op de user and poll tabellen, niet op de koppeltabel

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Een foreign key leg je op de koppeltabel. Op de user en poll tabellen leg je primary keys.

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

Topicstarter
P_de_B schreef op 10 October 2003 @ 10:42:
Je moet toch de constraints aanmaken op de user and poll tabellen, niet op de koppeltabel
Maar, kijk ik in de diagram, dan zet ie ze wel goed neer, en heb het met andere tabellen ook gedaan (en getest) en het werkte wel goed, op dezelfde manier...

Dus eigelijk denk ik van niet...

Maar dan zou ik dus Alter Table Poll_Poll moeten doen.. enz enz..
Overigens hebben ze ook een gecombineerde sleuten.. ff ter info :)

[ Voor 8% gewijzigd door Jaspertje op 10-10-2003 10:46 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Ik vind het eigenlijk vreemd dat je die error krijgt.

Normaal gezien mag die 'CASCADE' action van je relatie enkel uitgevoerd worden als je iets verwijderd uit bv de User tabel.
Die gaat gaan 'cascaden' naar de user_polls tabel. De User_Poll tabel zou dan op zijn beurt de foreign-key cascade naar de Poll tabel niet mogen uitvoeren.

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

Topicstarter
whoami schreef op 10 October 2003 @ 10:48:
Ik vind het eigenlijk vreemd dat je die error krijgt.

Normaal gezien mag die 'CASCADE' action van je relatie enkel uitgevoerd worden als je iets verwijderd uit bv de User tabel.
Die gaat gaan 'cascaden' naar de user_polls tabel. De User_Poll tabel zou dan op zijn beurt de foreign-key cascade naar de Poll tabel niet mogen uitvoeren.
Dat klopt zou ik zeggen.. er staan trouwens nog geen gegevens in Poll_WhoHasVoted.. dus daar kan het niet aan liggen..

maar het plaatje zou zo zijn: Poll_Poll --> Poll_WhoHasVoted <-- Users

Dus sowieso gaat de delete niet verder dan WhoHasVoted

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

Topicstarter
Goed, nog ff verder gezocht.. en kwam bij Microsoft uit..Ik zal het dus anders moeten gaan doen:
kijk maar hier

Eens kijken hoe we het gaan doen..

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 10 October 2003 @ 10:43:
Een foreign key leg je op de koppeltabel. Op de user en poll tabellen leg je primary keys.
Geldt het feit dat het vrijdag is, en ik een drukke week heb gehad als excuus?

:)

[ Voor 1% gewijzigd door P_de_B op 10-10-2003 11:43 . Reden: dt ]

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1