2012-03-29 10 views
5

Wiem, że pytanie, jak zaktualizować wiele tabel w SQL zostało zadane wcześniej, a wspólną odpowiedź wydaje się robić je oddzielnie w transakcji.Jak zaktualizować 2 kolumny w 2 tabelach, które mają klucz obcy

Jednak dwie kolumny, które muszę zaktualizować, mają klucz obcy, więc nie można ich zaktualizować osobno.

np.

Table1.a jest kluczem obcym do Table2.a

Jeden z wpisów w tabelach jest źle, na przykład obie kolumny są "xxx" i powinny być "yyy"

Jak zaktualizować Table1.a i Table2.a na "yyy"?

Wiem, że mógłbym tymczasowo usunąć klucz i wymienić, ale na pewno jest inny sposób.

Dzięki

Odpowiedz

10

Nie można wykonać aktualizację Jednocześnie jednak można wymusić SQL, aby wykonać aktualizację. Musisz upewnić się, że klucze obce mają wywoływane referencyjnie działania, np. ON UPDATE CASCADE

np.

ALTER TABLE YourTable 
ADD CONSTRAINT FK_YourForeignKey 
FOREIGN KEY (YourForeignKeyColumn) 
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE 
+0

Dzięki, że wyjaśnia, że ​​nie mogę. Cascade działa dobrze. – Sunrise

+0

+1 ode mnie! –

2

moja odpowiedź jest na podstawie poniższego linku: http://msdn.microsoft.com/en-us/library/ms174123%28v=SQL.90%29.aspx

Musisz upewnić się, że table_constraint zostaną zdefiniowane jako ON UPDATE CASCADE

  CREATE TABLE works_on1 
     (emp_no INTEGER NOT NULL, 
      project_no CHAR(4) NOT NULL, 
      job CHAR (15) NULL, 
      enter_date DATETIME NULL, 
      CONSTRAINT prim_works1 PRIMARY KEY(emp_no, project_no), 
      CONSTRAINT foreign1_works1 FOREIGN KEY(emp_no) REFERENCES employee(emp_no) ON DELETE CASCADE, 
      CONSTRAINT foreign2_works1 FOREIGN KEY(project_no) REFERENCES project(project_no) ON UPDATE CASCADE) 

i wtedy, kiedy będzie zmienić wartość klucz podstawowy

, patrz następująca oferta:

Dla ON DELETE lub ON UPDATE, jeśli podano opcję CASCADE, wiersz jest aktualizowany w tabeli odwołań, jeśli odpowiadający wiersz jest aktualizowany w tabeli nadrzędnej. Jeśli NIE MA AKCJI ma wartość , SQL Server Compact Edition zwraca błąd, a akcja aktualizacji w przywołanym wierszu w tabeli nadrzędnej jest wycofywana.

Na przykład w bazie danych mogą znajdować się dwie tabele, A i B. Tabela A ma relacyjną relację z tabelą B: klucz obcego klucza A.ItemID odwołuje się do klucza podstawowego B.ItemID.

Jeśli instrukcja UPDATE jest wykonywany na wiersz w tabeli B i ON UPDATE CASCADE działania jest określony dla A.ItemID, SQL Server Compact kontrole Edition dla jednego lub więcej zależnych wierszy w tabeli A. Jeżeli którykolwiek istnieć , zależne wiersze w tabeli a są aktualizowane, podobnie jak rząd wymieniony w tabeli B.

Ewentualnie, jeśli żadne działanie nie jest określony, SQL Server Compact Edition zwraca błąd i wycofuje akcję aktualizacji na odwołuje wiersz w tabeli B, gdy w tabeli A znajduje się co najmniej jeden wiersz, który odwołuje się do .

+0

Dzięki, kaskadowanie aktualizacji działa dobrze. – Sunrise

2

Nie będąc fanem kaskady aktualizacji, sugerowałbym inną trasę.

Najpierw nie aktualizujesz tabeli Parent, dodajesz nowy rekord z żądaną wartością (i te same dane, co inny rekord dla wszystkich innych pól). Wtedy nie masz trudności z aktualizowaniem tabel podrzędnych, aby użyć tej wartości zamiast tej wartości. Co więcej, masz teraz możliwość wykonywania pracy w partiach, aby uniknąć blokowania systemu, podczas gdy zmiana za jego pośrednictwem. Po zaktualizowaniu wszystkich tabel podrzędnych możesz usunąć oryginalny zły rekord.

+0

Dziękuję za odpowiedź, która brzmi dobrze, ale muszę zachować te same pola tożsamości i istnieją unikalne indeksy w 4 innych kolumnach, co ograniczyłoby ich duplikację wymaganą dla twojej metody. – Sunrise

Powiązane problemy