Додайте новий стовпець із обмеженням зовнішнього ключа в одну команду


128

Я намагаюся додати новий стовпець, який буде зовнішнім ключем. Мені вдалося додати стовпчик та обмеження зовнішнього ключа за допомогою двох окремих ALTER TABLEкоманд:

ALTER TABLE one
ADD two_id integer;

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

Чи є спосіб це зробити за допомогою однієї команди ALTER TABLE замість двох? Я нічого не міг придумати.


Відповіді:


185

Як часто це стосується питання, пов'язаного з SQL, це залежить від СУБД. Деякі СУБД дозволяють комбінувати операції таблиці ALTER, розділені комами. Наприклад...

Синтаксис Informix :

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

Синтаксис для IBM DB2 LUW схожий, повторюючи ключове слово ADD, але (якщо я правильно прочитав діаграму), не потрібно кома для відокремлення доданих елементів.

Синтаксис Microsoft SQL Server :

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

Деякі інші не дозволяють комбінувати операції ALTER TABLE так. Стандартний SQL дозволяє виконувати лише одну операцію в операторі ALTER TABLE, тому в Standard SQL це потрібно зробити в два етапи.


5
Друга Додавання та обмеження.
Імран

18
Для частини SQL, щоб надати ім'я обмеження, ви записуєте його так: ALTER TABLE [Повідомлення] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Драгош Дурлут

78

У MS-SQLServer:

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

для якого двигуна БД це?
knocte

@knocte це для сервера ms sql - питання тепер позначено для уточнення цього
sqladmin

Я не думаю, що питання потребує уточнення, оскільки прийнята відповідь вже говорить про те, що між двигунами БД є велика різниця в тому, як це зробити, що потрібно уточнити, це ваша відповідь, тому я щойно це зробив
knocte

9
Вгору для назви обмежень. Прийнята відповідь дозволяє системі генерувати ім’я, яке пізніше і важко керувати згодом.
Дерпі

17

Для SQL Server це має бути щось на кшталт

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

1
Це трохи більш стисло, ніж інші відповіді.
Сем

11

У MS SQL SERVER:

Ім'я іноземного ключа, визначене користувачем

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

Без визначеного користувачем імені іноземного ключа

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


2

Оновлення 2020 року

Це досить старе питання, але люди все ще повертаються до нього, я бачу. Якщо наведені вище відповіді не допомогли вам, переконайтеся, що ви використовуєте той самий тип даних для нового стовпця, що ідентифікатор іншої таблиці.

У моєму випадку я використовував Laravel, і я використовував "непідписане ціле число" для всіх своїх ідентифікаторів, оскільки немає сенсу мати негативний ідентифікатор LOL.

Отже, для цього необроблений SQL-запит зміниться так:

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

Я сподіваюся, що це допомагає


1
"ADD CONSTRAINT" повинен бути просто "CONSTRAINT", так?
TimH




1

Для DB2 синтаксис:

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

0

Якщо вам також потрібно додати значення за замовчуванням у випадку, якщо у вас вже є кілька рядків у таблиці, додайте значення DEFAULT

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

0

Спробуйте це:

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

1
Ласкаво просимо до SO! Будь ласка, коментуйте свої відповіді, коли вони просто кодуються. У вашому випадку є багато відповідей, досить подібних до ваших, тому розкрийте свої переваги.
Девід Гарсія Бодего
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.