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

mus*_*oom 118 sql

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

    ALTER TABLE one
    ADD two_id integer;

    ALTER TABLE one
    ADD FOREIGN KEY (two_id) REFERENCES two(id);
Run Code Online (Sandbox Code Playgroud)

有没有办法用一个ALTER TABLE命令而不是两个?我无法想出任何有效的东西.

Jon*_*ler 172

与SQL相关的问题一样,它取决于DBMS.某些DBMS允许您组合以逗号分隔的ALTER表操作.例如...

Informix语法:

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);
Run Code Online (Sandbox Code Playgroud)

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

Microsoft SQL Server语法:

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);
Run Code Online (Sandbox Code Playgroud)

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

  • 对于SQL部分,要为约束命名,可以这样写:ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL,CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY(AlertTriggerID)REFERENCES AlertTriggers(AlertTriggerID); (15认同)
  • Second Add and constraint. (4认同)

小智 70

在MS-SQLServer中:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)
Run Code Online (Sandbox Code Playgroud)

  • 为命名约束.接受的答案让系统生成名称,这个名称很难,以后很难管理. (7认同)

jau*_*sel 16

对于SQL Server,它应该是这样的

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)
Run Code Online (Sandbox Code Playgroud)


小智 6

MS SQL SERVER中:

用户定义的外键名称

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);
Run Code Online (Sandbox Code Playgroud)

没有用户定义的外键名称

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);
Run Code Online (Sandbox Code Playgroud)


Lea*_*ner 6

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);
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助

  • “添加约束”应该只是“约束”,是吗? (3认同)

O.B*_*adr 5

在甲骨文中:

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);
Run Code Online (Sandbox Code Playgroud)