2009-09-04 17 views
19

Potrzebuję zaktualizować klucz podstawowy dla rekordu, ale jest to także klucz obcy w dwóch innych tabelach. I potrzebuję zaktualizowanego klucza głównego, aby znalazł się również w tabelach podrzędnych.Klucz podstawowy aktualizacji SQL Server, który jest również kluczem obcy w dwóch tabelach

Oto moje zapytania i błąd:

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 

nie pamiętam jak się za to zabrać więc dlatego tu jestem. Jakaś pomoc?

+0

Inna opcja: unikaj używania zmiennego klucza podstawowego. Zamiast tego użyj IDENTITY jako klucza podstawowego. Zachowaj unikalne ograniczenie na kolumnach, które muszą być unikatowe. To może być poza twoją kontrolą, ale działa to dla nas dobrze. Nasi użytkownicy mogą zmieniać identyfikator tak, jak chcą i nie ma to wpływu na faktyczny klucz podstawowy. –

Odpowiedz

16

Mogą Państwo:

  1. wyłączyć egzekwowania ograniczeń FK tymczasowo (patrz here lub here)
  2. aktualizacji Twój PK
  3. zaktualizować swój FKS
  4. umożliwiają powrót egzekwowania ograniczeń FK

Zrób to wszystko w ramach transakcji i upewnij się, że jeśli transakcja się nie powiedzie, przywracasz ją poprawnie i nadal egzekwujesz ograniczenia FK.

Ale ... dlaczego trzeba zmienić PK? Mam nadzieję, że jest to akcja, która jest rzadko wykonywana (import danych starszych lub coś w tym stylu).

33

Czy Twoje relacje z wykorzystaniem

ON UPDATE CASCADE 

Jeśli są one następnie zmienia klucz w tabeli podstawowej zaktualizuje kluczy obcych.

np.

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

Każdy sposób opowiadania bez patrzenia na scenariusz? Nie mam uprawnień, by na to patrzeć. – NMan

+2

sure: 'BEGIN TRANSACTION; DELETE FROM ParentTable WHERE ID =?; ROLLBACK; ' jeśli widzisz naruszenie FK, to aktualizacja FK jest ograniczona. – van

+0

To powinna być zaakceptowana odpowiedź. Uważam, że najbliżej odnosi się do pytania PO i robi to w lepszy sposób niż obecnie zaakceptowana odpowiedź. –

1

idź do obcych relacji kluczowych każdej tabeli podrzędnej i na specyfikację wstawiania i aktualizowania zmień reguły usuwania i aktualizacji na kaskadowe. Może to pomóc u trochę

+0

Nie wiem, dlaczego to zostało odrzucone - to jest dokładnie to samo, co odpowiedź z najwyższymi głosami, tylko w interfejsie, a nie w SQL! –

6

Jeśli chcesz ustawić regułę Cascade graficznie następnie ustawiona Cascade orzekania w SQL Management Studio

  1. Otwórz tabelę w trybie projektowania
  2. przycisk Kliknij związku z górnym pasku
  3. Wybierz żądane relacji FK (jeden po drugim)
  4. Right Side - Rozwiń INSERT lub UPDATE Specyfikacja
  5. zmienić regułę UPDATE do - Cascade

Zamknij i zapisz, gotowe!

(wypróbowane na SQL 2008)

+1

JESTEŚ CZŁOWIEKIEM !!! –

4

Ponieważ nie jestem zbyt pewny siebie wyłączenie ograniczenia FK, wolę też:

  1. Duplikat wiersz ze starym PK z jednego z nowych PK
  2. Aktualizacja FKS
  3. usunąć wiersz ze starym PK

zaletę: Nie ograniczający naruszone dur proces.

Powiązane problemy