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

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

    ALTER TABLE one
    ADD two_id integer;

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

Есть ли способ сделать это с помощью одной команды ALTER TABLE вместо двух? Я не мог придумать ничего, что работает.

Ответ 1

Как часто с вопросом, связанным с 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 это должно быть сделано в два этапа.

Ответ 2

В MS-SQLServer:

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

Ответ 3

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

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

Ответ 4

В 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);

Ответ 5

В Oracle:

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);

Ответ 6

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

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

Ответ 7

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

ALTER TABLE one
ADD two_id INTEGER REFERENCES two;

Ответ 8

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

Ответ 9

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

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

Ответ 10

2018 Обновление

Это довольно старый вопрос, но люди все еще возвращаются к нему, я вижу. Если приведенные выше ответы не помогли вам, убедитесь, что вы используете тот же тип данных для нового столбца, что и идентификатор другой таблицы.

В моем случае я использовал 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);

Я надеюсь, что это помогает

Ответ 11

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

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