Добавить новый столбец с ограничением внешнего ключа одной командой

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, поэтому в стандартном SQL она должна выполняться в два этапа.

Джонатан Леффлер
источник
5
Второе добавление и ограничение.
Имран
18
Для части SQL, чтобы дать имя ограничению, вы пишете его так: ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut
79

В MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)
SQLAdmin
источник
для какого движка БД это?
knocte
@knocte это для ms sql server - вопрос теперь помечен, чтобы прояснить это
sqladmin
Я не думаю, что вопрос нуждается в разъяснении, поскольку в принятом ответе уже говорится, что между механизмами БД существует большая разница в том, как это сделать, то, что нужно уточнить, это ваш ответ, поэтому я только что сделал это
knocte
9
За то, что назвал ваше ограничение. Принятый ответ позволяет системе сгенерировать имя, которое будет неприглядным и трудным для последующего использования.
Дерпи
17

Для SQL Server это должно быть что-то вроде

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)
jausel
источник
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);
Сандип Бадиколу
источник
3

В Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);
O.Badr
источник
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
«ДОБАВИТЬ ОГРАНИЧЕНИЕ» должно быть просто «ОГРАНИЧЕНИЕМ», да?
TimH
1

Вы можете сделать это, как показано ниже, в SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)
user2010014
источник
1

PostgreSQL DLL для добавления столбца FK:

ALTER TABLE one
ADD two_id INTEGER REFERENCES two;
Кшитидж Баджрачарья
источник
1

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

Арсман Ахмад
источник
1

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

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);
Дэн Б.
источник
0

Если вам также нужно добавить значения по умолчанию, если у вас уже есть несколько строк в таблице, добавьте DEFAULT val

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);
iMalek
источник
0

Попробуй это:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);
Майкл Алаваньо
источник
1
Добро пожаловать в SO! Пожалуйста, прокомментируйте свои ответы, если они просто код. В вашем случае есть много ответов, очень похожих на ваш, поэтому расскажите о преимуществах своего.
Дэвид Гарсия Бодего