Добавьте новый столбец с внешним ключом в одну команду
Я пытаюсь добавить новый столбец, который будет внешним ключом. Мне удалось добавить столбец и ограничение внешнего ключа с помощью двух отдельных команд 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);