Mam ograniczenie klucza obcego w mojej tabeli, chcę dodać do niego ON DELETE CASCADE.
Próbowałem tego:
zmiana tabeli nazwa_tabeli_podrzędnej zmodyfikuj ograniczenie fk_name klucz obcy (nazwa_kolumny_podrzędnej) odwołuje się nazwa_tabeli_nadrzędnej (nazwa_kolumny_nadrzędnej) przy usuwaniu kaskadowym;
Nie działa.
EDYCJA:
Klucz obcy już istnieje, w kolumnie klucza obcego znajdują się dane.
Komunikat o błędzie, który otrzymuję po wykonaniu instrukcji:
ORA-02275: takie ograniczenie referencyjne już istnieje w tabeli
Odpowiedzi:
Nie możesz dodać
ON DELETE CASCADE
do już istniejącego ograniczenia. Będziesz musiałdrop
i powstrzymaćcreate
przymus. Z dokumentacji wynika, żeMODIFY CONSTRAINT
klauzula może tylko modyfikować stan ograniczenia (tj .:ENABLED/DISABLED
...).źródło
Najpierw
drop
klucz obcy i wypróbuj powyższe polecenie, wstawadd constraint
zamiastmodify constraint
. Teraz to jest polecenie:ALTER TABLE child_table_name ADD CONSTRAINT fk_name FOREIGN KEY (child_column_name) REFERENCES parent_table_name(parent_column_name) ON DELETE CASCADE;
źródło
Jak wyjaśniono wcześniej:
ALTER TABLE TABLEName drop CONSTRAINT FK_CONSTRAINTNAME; ALTER TABLE TABLENAME ADD CONSTRAINT FK_CONSTRAINTNAME FOREIGN KEY (FId) REFERENCES OTHERTABLE (Id) ON DELETE CASCADE ON UPDATE NO ACTION;
Jak widać, muszą to być oddzielne polecenia, najpierw upuszczone, a następnie dodane.
źródło
go
z średnikiem, jak w postgres i samym SqlServer. Ale pozostałe podstawowe kody są standardowe sql. Test z średnikami, właśnie to zmieniłem[
Lub]
są nieważne w standardzie SQL (i Oracle). Oracle nie obsługuje równieżon update
klauzuli dotyczącej klucza obcego.[
]
są specyficzne dla SqlServer. Wyczyszczę to bardziej. O którymon update
nie mogę nic powiedzieć.Odpowiedź dla UŻYTKOWNIKÓW MYSQL:
ALTER TABLE ChildTableName DROP FOREIGN KEY `fk_table`; ALTER TABLE ChildTableName ADD CONSTRAINT `fk_t1_t2_tt` FOREIGN KEY (`parentTable`) REFERENCES parentTable (`columnName`) ON DELETE CASCADE ON UPDATE CASCADE;
źródło
Ten PL * SQL zapisze do DBMS_OUTPUT skrypt, który porzuci każde ograniczenie, które nie ma kaskady usuwania i odtworzy je z kaskadą usuwania.
UWAGA: uruchomienie danych wyjściowych tego skryptu odbywa się NA WŁASNE RYZYKO. Najlepiej przeczytać wynikowy skrypt i edytować go przed wykonaniem.
DECLARE CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS select * from user_cons_columns where constraint_name = theCons and owner = theOwner order by position; firstCol BOOLEAN := TRUE; begin -- For each constraint FOR cons IN (select * from user_constraints where delete_rule = 'NO ACTION' and constraint_name not like '%MODIFIED_BY_FK' -- these constraints we do not want delete cascade and constraint_name not like '%CREATED_BY_FK' order by table_name) LOOP -- Drop the constraint DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' DROP CONSTRAINT ' || cons.CONSTRAINT_NAME || ';'); -- Re-create the constraint DBMS_OUTPUT.PUT('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' ADD CONSTRAINT ' || cons.CONSTRAINT_NAME || ' FOREIGN KEY ('); firstCol := TRUE; -- For each referencing column FOR consCol IN consCols(cons.CONSTRAINT_NAME, cons.OWNER) LOOP IF(firstCol) THEN firstCol := FALSE; ELSE DBMS_OUTPUT.PUT(','); END IF; DBMS_OUTPUT.PUT(consCol.COLUMN_NAME); END LOOP; DBMS_OUTPUT.PUT(') REFERENCES '); firstCol := TRUE; -- For each referenced column FOR consCol IN consCols(cons.R_CONSTRAINT_NAME, cons.R_OWNER) LOOP IF(firstCol) THEN DBMS_OUTPUT.PUT(consCol.OWNER); DBMS_OUTPUT.PUT('.'); DBMS_OUTPUT.PUT(consCol.TABLE_NAME); -- This seems a bit of a kluge. DBMS_OUTPUT.PUT(' ('); firstCol := FALSE; ELSE DBMS_OUTPUT.PUT(','); END IF; DBMS_OUTPUT.PUT(consCol.COLUMN_NAME); END LOOP; DBMS_OUTPUT.PUT_LINE(') ON DELETE CASCADE ENABLE VALIDATE;'); END LOOP; end;
źródło
Dla każdego, kto używa MySQL:
Jeśli wejdziesz na swoją
PHPMYADMIN
stronę internetową i przejdziesz do tabeli zawierającej klucz obcy, który chcesz zaktualizować, wystarczy kliknąćRelational view
znajdujący się naStructure
karcie i zmienićOn delete
opcję menu wyboru naCascade
.Obraz pokazany poniżej:
źródło
Oto przydatne rozwiązanie! Używam SQL Server 2008 R2.
Jeśli chcesz zmodyfikować ograniczenie FK, dodając ON DELETE / UPDATE CASCADE, wykonaj następujące kroki:
NUMER 1:
Kliknij prawym przyciskiem myszy wiązanie i kliknij, aby zmienić
NUMER 2:
Wybierz swoje ograniczenie po lewej stronie (jeśli jest więcej niż jedno). Następnie po prawej stronie zwiń punkt „ WSTAW I AKTUALIZUJ specyfikację ” i określ akcje w wierszu Usuń regułę lub Aktualizuj regułę zgodnie z potrzebami. Następnie zamknij okno dialogowe.
NUMER 3:
Ostatnim krokiem jest zapisanie tych modyfikacji (oczywiście!)
PS: To uratowało mnie od mnóstwa pracy, ponieważ chcę zmodyfikować klucz podstawowy, do którego odwołuje się inna tabela.
źródło
Jeśli chcesz zmienić klucz obcy bez upuszczania go, możesz zrobić:
ALTER TABLE child_table_name WITH CHECK ADD FOREIGN KEY(child_column_name) REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE
źródło
ALTER TABLE `tbl_celebrity_rows` ADD CONSTRAINT `tbl_celebrity_rows_ibfk_1` FOREIGN KEY (`celebrity_id`) REFERENCES `tbl_celebrities`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
źródło