【问题标题】: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 命令而不是两个来做到这一点?我想不出任何可行的方法。

【问题讨论】:

标签: sql


【解决方案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!请在它们只是代码时评论您的答案。在您的情况下,有很多答案与您的答案非常相似,因此请公开您的好处。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-04-03
                  • 1970-01-01
                  • 2017-06-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多