在一个命令中添加具有外键约束的新列

Posted

技术标签:

【中文标题】在一个命令中添加具有外键约束的新列【英文标题】:Add new column with foreign key constraint in one command 【发布时间】:2013-07-12 19:23:34 【问题描述】:

我正在尝试添加一个将作为外键的新列。我已经能够使用两个单独的ALTER TABLE 命令添加列和外键约束:

ALTER TABLE one
ADD two_id integer;

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

有没有办法用一个 ALTER TABLE 命令而不是两个来做到这一点?我想不出任何可行的方法。

【问题讨论】:

mysql 中:***.com/questions/1545253/… 【参考方案1】:

通常与 SQL 相关的问题一样,它取决于 DBMS。一些 DBMS 允许您组合用逗号分隔的 ALTER 表操作。比如……

Informix 语法:

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

IBM DB2 LUW 的语法类似,重复关键字 ADD,但(如果我正确阅读图表)不需要逗号来分隔添加的项目。

微软SQL Server语法:

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

其他一些不允许您像这样组合 ALTER TABLE 操作。标准 SQL 只允许在 ALTER TABLE 语句中进行单个操作,因此在标准 SQL 中,必须分两步完成。

【讨论】:

第二次添加和约束。 对于 SQL 部分,要为约束命名,可以这样写: ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID) ;【参考方案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】:

2020 年更新

这是一个相当老的问题,但我看到人们仍在回归它。如果上述答案对您没有帮助,请确保您对新列使用与其他表的 id 相同的数据类型。

在我的例子中,我使用的是 Laravel,我对我的所有 id 都使用“无符号整数”,因为没有必要使用负 id LOL。

因此,原始 SQL 查询将如下更改:

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

希望对你有帮助

【讨论】:

“ADD CONSTRAINT”应该只是“CONSTRAINT”,是吗?【参考方案7】:

PostgreSQL DLL 添加 FK 列:

ALTER TABLE one
ADD two_id INTEGER REFERENCES two;

【讨论】:

【参考方案8】:

对于 DB2,语法是:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

你可以在 SQL Server 中像下面那样做

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

【讨论】:

【参考方案11】:

如果您还需要添加默认值以防表中已有一些行,请添加 DEFAULT val

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

【讨论】:

【参考方案12】:

试试这个:

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

【讨论】:

欢迎来到 SO!请在它们只是代码时评论您的答案。在您的情况下,有很多答案与您的答案非常相似,因此请公开您的好处。

以上是关于在一个命令中添加具有外键约束的新列的主要内容,如果未能解决你的问题,请参考以下文章

带有连接表的 MySQL 外键约束(具有相同外键约束时出错)

怎么添加外键约束

MySQL 错误 1215:无法添加外键约束

MySQL 无法添加外键约束

Sequelize - 无法添加或更新子行:外键约束失败

如何在 Laravel 5.1 完整性约束违规中添加外键:1452?