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


128

我试图添加一个新列,这将是一个外键。我已经能够使用两个单独的ALTER TABLE命令添加列和外键约束:

ALTER TABLE one
ADD two_id integer;

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

有没有一种方法可以使用一个ALTER TABLE命令而不是两个?我无法提出任何可行的方法。


Answers:


185

与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,但是(如果我正确地阅读了该图)则不需要逗号来分隔添加的项。

Microsoft SQL Server语法:

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

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


5
第二添加和约束。
伊兰(Imran)2014年

18
对于SQL部分,要为约束命名,您可以这样编写:ALTER TABLE [消息] ADD [AlertTriggerID] BIGINT空,CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY(AlertTriggerID)参考AlertTriggers(AlertTriggerID);
Dragos Durlut '16

78

在MS-SQLServer中:

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

这是什么数据库引擎?
knocte '16

@knocte它用于ms sql服务器-现在标记问题以澄清这一点
sqladmin 2016年

我认为这个问题不需要澄清,因为已经接受的答案已经表明,数据库引擎之间在执行方法上有很大的不同,需要澄清的是您的答案,所以我就是这样做的
knocte

9
准备命名约束。接受的答案可以使系统生成名称,该名称容易出错,以后很难管理。
Derpy

17

对于SQL Server,它应该类似于

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

1
这比其他答案更为简洁。
2015年

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


2

2020更新

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

就我而言,我使用的是Laravel,所有ID均使用“无符号整数”,因为没有负ID大声笑的意思。

因此,原始SQL查询将像这样更改:

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

希望对您有所帮助


1
“ ADD CONSTRAINT”应该只是“ CONSTRAINT”,是吗?
TimH

1

您可以像下面在SQL Server中那样进行操作

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



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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.