在一个命令中添加具有外键约束的新列
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!请在它们只是代码时评论您的答案。在您的情况下,有很多答案与您的答案非常相似,因此请公开您的好处。以上是关于在一个命令中添加具有外键约束的新列的主要内容,如果未能解决你的问题,请参考以下文章