Jak dodać kolumnę i uczynić ją kluczem obcym w pojedynczej instrukcji MySQL?

83

Czy w mysql mogę dodać kolumnę i klucz obcy w tej samej instrukcji? Jaka jest właściwa składnia dodawania fk?

Oto mój SQL:

ALTER TABLE database.table
 ADD COLUMN columnname INT DEFAULT(1),
 FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

... i towarzyszący komunikat o błędzie:

Masz błąd w składni SQL; sprawdź podręcznik, który odpowiada twojej wersji serwera MySQL, aby znaleźć właściwą składnię, której należy użyć w pobliżu 'FOREIGN KEY (fk_name) REFERENCES reftable (refcolumn) ON DELETE CASCADE' 'w linii 4

VinnieP
źródło

Odpowiedzi:

99

Spróbuj tego:

ALTER TABLE database.table
  ADD COLUMN columnname INT DEFAULT(1),
  ADD FOREIGN KEY fk_name(fk_column) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Asaf
źródło
6
I dla fk_namei fk_columnmuszę wstawić whaat ...?
C4d
7
@ C4ud3x fk_namebędzie nazwą, którą chciałbyś nadać temu konkretnemu ograniczeniu w celu identyfikacji (jest to opcjonalne w zapytaniu). Mysql automatycznie je generuje i fk_columnjest kolumną odwołującą się, która ma działać jako klucz obcy.
Rabia Naz khan
1
Radziłbym wszystkim jawnie określić nazwę ograniczenia. Paskudne problemy mogą cię znaleźć, jeśli chcesz usunąć tę kolumnę w przyszłości, a twój system działa już w różnych bazach danych, które mają różne pomysły na automatyczne nazywanie ograniczeń (na przykład mariaDB vs mySQL). Chciałem zaoszczędzić ten jeden wiersz kodu i nie sprecyzowałem ograniczenia, jak tutaj. Kilka miesięcy po zapłaceniu ceny próbując napisać migrację, która usunęłaby kolumnę we wszystkich systemach. stackoverflow.com/questions/55374835/…
Alkis Mavridis
39

Następujące zapytanie dodaje kolumnę za pomocą zapytania alter, a zapytanie ograniczające sprawia, że ​​jest to FK w pojedynczym zapytaniu mysql. Możesz to zrobić w ten sposób,

SKŁADNIA:

ALTER TABLE `SCHEMANAME`.`TABLE1` 
ADD COLUMN `FK_COLUMN` BIGINT(20) NOT NULL, 
ADD CONSTRAINT `FK_TABLE2_COLUMN` FOREIGN KEY (`FK_COLUMN`) 
REFERENCES `SCHEMANAME`.`TABLE2`(`PK_COLUMN`);

PRZYKŁAD:

ALTER TABLE `USERDB`.`ADDRESS_TABLE` 
ADD COLUMN `USER_ID` BIGINT(20) NOT NULL AFTER `PHONE_NUMBER`, 
ADD CONSTRAINT `FK_CUSTOMER_TABLE_CUSTOMER_ID` FOREIGN KEY (`USER_ID`) 
REFERENCES `USERDB`.`CUSTOMER_TABLE`(`CUSTOMER_ID`); 
Szczęściarz
źródło
3

Można to nieco uprościć. Wystarczy dodać słowo kluczowe „ADD” przed „FOREIGN KEY”. Dodanie przykładu poniżej.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1),
ADD FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Satendra Rawat
źródło
-3

Możesz tego użyć.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1);
ALTER TABLE database.table add FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Aabid Ansar
źródło