关于sql server:如何在MS SQL中的现有(填充)表中添加NOT NULL FOREIGN KEY列?

How do you add a NOT NULL FOREIGN KEY column to an existing (populated) table in MS SQL?

我需要向现有(填充的)表中添加一个非空列,该表将成为另一个表的外键。这带来了两个问题:

  • 添加列时,其值不能为空-使用默认值不是选项(除非稍后删除),因为当用户输入新记录时(即当应用程序尝试添加具有空值的此字段的记录时),数据库逻辑用于服务器端验证,即当应用程序尝试添加具有空值的此字段的记录时,数据库会引发一个错误,即应用程序捕获并返回给用户,提示他们更正它。

  • 该列有一个外键约束,这意味着它的值也必须存在于外部表中。

  • 最好的方法是什么?


    创建列,但允许空。用外键表中的正确数据填充列。更改列,添加不为空。添加外键约束。


    关于你的部分问题(多年后的OFC):

    1.如果您的意思是,默认值将是如此智能的值,并且将来不需要更改它,那么您的愿望是错误的。为什么?

    有两个原因:

    • a)在默认值的概念中(在每个where编程中语言、数据库等…)默认值不是用所需的内容动态替换该值。为了示例func sum(a,b,c=10),在这种情况下,如果不输入参数c,它将取10,否则应输入相反。所以默认值是可预测和可计算的价值观,而不是聪明的价值观。
    • b)外键比可选的更敏感。一个方法中的参数,因为RDBMSS中的关系意义所以u当然应该在将来编辑它,即使有时它会改变基于数据库的用途而进行的多次修改。

    2.可以用我给你看的代码来处理。

    因此,基于这种解释,您可以有一个默认值的列,它存在于fkeys中,但它不是您需要的,您应该在将来根据您的使用情况更新它。为此,你需要:

    第一:

    • 创建返回有效且存在的外键的函数特定表格如下:
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE FUNCTION SelectMinForeignKey()
    RETURNS INT
    AS
    BEGIN
      DECLARE @FirstID INT
      SELECT @FirstID = MIN(ID) from DetailTableExample01
      RETURN @FirstID
    END

    第二:

    • 然后,您应该修改您的表以添加这样的列:
    1
    ALTER TABLE example1 ADD NoNullableCol INT NOT NULL DEFAULT [dbo].SelectMinForeignKey()
    • 或者立即添加关系:
    1
    2
    3
      ALTER TABLE example1
        ADD NoNullableCol2 INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey() ,
        FOREIGN KEY(NoNullableCol2) REFERENCES DetailTableExample01(id);
    • 或者更完整地立即添加约束和可分配FK名称:
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE dbo.example1 ADD
        NoNullableCol INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey(),
        CONSTRAINT FK_example1_DetailTableExample01
        FOREIGN KEY (NoNullableCol)
        REFERENCES dbo.DetailTableExample01 (ID)
         ON UPDATE  CASCADE
         ON DELETE  CASCADE;
    • 或:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TABLE dbo.example1 ADD
        NoNullableCol INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey()
    GO
    ALTER TABLE dbo.example1 ADD
        CONSTRAINT FK_example1_DetailTableExample01
        FOREIGN KEY (NoNullableCol)
        REFERENCES dbo.DetailTableExample01 (ID)
         ON UPDATE  CASCADE
         ON DELETE  CASCADE

    注意:正如您所知,表名和列名是示例。

    第三:

    • 现在,您应该根据需要更改非空列中的值。

    合而为一:

    • 整个查询应该是这样的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE FUNCTION SelectMinForeignKey()
    RETURNS INT
    AS
    BEGIN
      DECLARE @FirstID INT
      SELECT @FirstID = MIN(ID) from DetailTableExample01
      RETURN @FirstID
    END

    GO

    ALTER TABLE dbo.example1 ADD
        NoNullableCol INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey(),
        CONSTRAINT FK_example1_DetailTableExample01
        FOREIGN KEY (NoNullableCol)
        REFERENCES dbo.DetailTableExample01 (ID)
         ON UPDATE  CASCADE
         ON DELETE  CASCADE;

    完成了!

    希望它能解决你的问题