Dodaj nową kolumnę z ograniczeniem klucza obcego w jednym poleceniu


128

Próbuję dodać nową kolumnę, która będzie kluczem obcym. Udało mi się dodać kolumnę i ograniczenie klucza obcego za pomocą dwóch oddzielnych ALTER TABLEpoleceń:

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

Czy można to zrobić za pomocą jednego polecenia ALTER TABLE zamiast dwóch? Nie mogłem wymyślić niczego, co działa.


Odpowiedzi:


185

Jak to często bywa w przypadku pytań związanych z SQL, zależy to od DBMS. Niektóre DBMS umożliwiają łączenie operacji ALTER na tabelach oddzielonych przecinkami. Na przykład...

Składnia Informix :

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

Składnia dla IBM DB2 LUW jest podobna, z powtórzeniem słowa kluczowego ADD, ale (jeśli poprawnie odczytałem diagram) nie wymagając przecinka do oddzielenia dodanych pozycji.

Składnia Microsoft SQL Server :

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

Niektóre inne nie pozwalają na takie łączenie operacji ALTER TABLE. Standardowy SQL zezwala tylko na pojedynczą operację w instrukcji ALTER TABLE, więc w standardowym SQL musi to być wykonane w dwóch krokach.


5
Drugi Dodaj i ogranicz.
Imran

18
W przypadku części SQL, aby nadać ograniczeniu nazwę, piszesz to w ten sposób: ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut,

78

W MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

dla jakiego silnika DB to jest?
knocte

@knocte to jest dla serwera ms sql - pytanie jest teraz oznaczone, aby to wyjaśnić
sqladmin

Nie wydaje mi się, aby to pytanie wymagało wyjaśnienia, ponieważ przyjęta odpowiedź mówi już, że jest duża różnica między silnikami DB w tym, jak to zrobić, to, co należy wyjaśnić, to twoja odpowiedź, więc po prostu to zrobiłem
knocte

9
Do nazwania twojego ograniczenia. Zaakceptowana odpowiedź pozwala systemowi wygenerować nazwę, która jest nieprzyjemna i trudna do późniejszego zarządzania.
Derpy

17

W przypadku SQL Server powinno to być coś takiego

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

1
To jest trochę bardziej zwięzłe niż inne odpowiedzi.
Sam

11

W MS SQL SERVER:

Ze zdefiniowaną przez użytkownika nazwą klucza obcego

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

Bez nazwy klucza obcego zdefiniowanej przez użytkownika

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);


2

Aktualizacja 2020

To dość stare pytanie, ale widzę, że ludzie wciąż do niego wracają. Jeśli powyższe odpowiedzi nie pomogły, upewnij się, że używasz tego samego typu danych dla nowej kolumny, co identyfikator drugiej tabeli.

W moim przypadku używałem Laravel i używam „liczby całkowitej bez znaku” dla wszystkich moich identyfikatorów, ponieważ nie ma sensu mieć ujemnego identyfikatora LOL.

W tym celu surowe zapytanie SQL zmieni się w następujący sposób:

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

Mam nadzieję, że to pomoże


1
„DODAJ OGRANICZENIE” powinno być po prostu „OGRANICZENIE”, tak?
TimH,

1

Możesz to zrobić jak poniżej w SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)


1

ALTER TABLE TableName ADD NewColumnName INTEGER, FOREIGN KEY(NewColumnName) REFERENCES [ForeignKey_TableName](Foreign_Key_Column)


1

W przypadku DB2 składnia jest następująca:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);

0

Jeśli chcesz również dodać wartości domyślne w przypadku, gdy masz już kilka wierszy w tabeli, dodaj DEFAULT val

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);

0

Spróbuj tego:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

1
Witamy w SO! Prosimy o komentowanie odpowiedzi, gdy są one tylko kodem. W twoim przypadku jest wiele odpowiedzi dość podobnych do twojej, więc ujawnij swoje korzyści.
David García Bodego
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.