2009-09-04 3 views
19

Ich muss den Primärschlüssel für einen Datensatz aktualisieren, aber es ist auch der Fremdschlüssel in zwei anderen Tabellen. Und ich brauche den aktualisierten Primärschlüssel, der auch in den Kindtabellen reflektiert wird.SQL Server-Update Primärschlüssel, der auch ein Fremdschlüssel in zwei Tabellen ist

Hier ist meine Abfrage und der Fehler:

begin tran 
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Error 9/4/2009 10:04:49 AM 0:00:00.000 SQL Server Database Error: The UPDATE statement conflicted with the REFERENCE constraint "FK_GoalRequirement_Question". The conflict occurred in database "numgmttest", table "dbo.GoalRequirement", column 'QuestionID'. 14 0 

Ich erinnere mich nicht, wie das gehen zu tun, ist also, warum ich hier bin. Irgendeine Hilfe?

+0

Eine weitere Option: Vermeiden Sie einen veränderbaren Primärschlüssel. Verwenden Sie stattdessen IDENTITY als Primärschlüssel. Behalten Sie eine eindeutige Einschränkung für die Spalten, die eindeutig sein müssen. Das liegt vielleicht außerhalb Ihrer Kontrolle, aber es funktioniert gut für uns. Unsere Benutzer können die ID so oft ändern, wie sie möchten, und sie hat keinen Einfluss auf den eigentlichen Primärschlüssel. –

Antwort

16

Sie können:

  1. deaktivieren Durchsetzung FK Einschränkungen vorübergehend (siehe here oder here)
  2. Update Ihre PK
  3. Update Ihr FKs
  4. ermöglichen zurück Durchsetzung FK Einschränkungen

Machen Sie alles innerhalb einer Transaktion und stellen Sie sicher, dass Sie bei einer fehlgeschlagenen Transaktion das Rollback ordnungsgemäß durchführen und die FK-Einschränkungen weiterhin erzwingen.

Aber ... warum müssen Sie eine PK ändern? Ich hoffe, dass dies eine Aktion ist, die selten ausgeführt wird (Altdatenimport oder so ähnlich).

33

Sind Ihre Beziehungen

ON UPDATE CASCADE 

mit der Wenn sie dann den Schlüssel in der Primär-Tabelle die Fremdschlüssel wird aktualisiert, ändern sich.

z.B.

ALTER TABLE Books 
ADD CONSTRAINT fk_author 
FOREIGN KEY (AuthorID) 
REFERENCES Authors (AuthorID) ON UPDATE CASCADE 
+0

Wer kann es sagen, ohne das Skript zu betrachten? Ich habe nicht die Erlaubnis, darauf zu schauen. – NMan

+2

sicher: 'BEGIN TRANSACTION; LÖSCHEN VON ParentTable WHERE ID =?; ROLLBACK; ' Wenn Sie einen FK-Verstoß sehen, ist das Update von FK eingeschränkt. – van

+0

Dies sollte die akzeptierte Antwort sein. Ich denke, dass es die Frage des OP am besten anspricht und dies besser als die derzeit akzeptierte Antwort. –

1

gehen Sie zu den Fremdschlüsselbeziehungen der einzelnen untergeordneten Tabellen und bei Einfügen und Aktualisieren der Spezifikationsänderung löschen und aktualisieren Sie die Regeln in Kaskade. dies kann u wenig

+0

Ich weiß nicht, warum das abgelehnt wurde - das macht genau dasselbe wie die Antwort mit den höchsten Stimmen, nur in der Benutzeroberfläche und nicht mit SQL! –

6

helfen Wenn Sie die Cascade Regel grafisch dann setzen Cascade Regel auf SQL Management Studio

  1. öffnen Tabelle im Entwurfsmodus
  2. Klicken Sie Relationship Schaltfläche oberen Symbolleiste
  3. setzen möchten
  4. Wählen Sie die gewünschten Beziehungen FK (eins nach dem anderen)
  5. Right Side - INSERT oder UPDATE Spezifikation erweitern
  6. ändern Sie die UPDATE-Regel - Cascade

Schließen und speichern, Fertig!

(Versuchte auf SQL 2008)

+1

SIE SIND DER MANN !!! –

4

Da bin ich mir nicht zu sicher Einschränkungen FK deaktivieren, ziehe ich es auch:

  1. Duplizieren Sie die Zeile mit dem alten PK mit einem mit dem neuen PK
  2. die FKs aktualisieren
  3. die Zeile mit dem alten PK löschen

Vorteil: Keine Einschränkung verletzt dur den Prozess.

Verwandte Themen