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

时间:2010-03-11 06:51:58

标签: sql-server sql-server-2005 foreign-keys constraints nullable

我需要将NOT NULL列添加到现有(已填充)表中,该表将是另一个表的外键。这带来了两个问题:

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

  2. 该列具有外键约束,这意味着它的值也必须存在于外表中。

  3. 最好的方法是什么?

2 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:1)

关于你的部分问题(经过多年的经历):

1 。如果您的意思是默认值非常聪明,并且您将来不需要更改它,那么您的愿望是错误的。为什么呢?

有两个原因:

  • a)在默认值的概念中(在每个编程中) 语言,数据库等......)默认值不是哪个 用你想要的东西动态地替换值。对于 示例功能总和(a,b,c = 10),在这种情况下,如果您不输入参数c,则将其设为10,否则您应输入
    相反的东西。所以默认值是可预测和可计算的 价值观,而非智能价值。
  • b)外键比选项更敏感 方法中的参数,在RDBMS中的关系意义的因子,所以你 肯定应该在将来编辑,甚至可能有时它会改变 根据DB的用法反复进行。

2 。可以使用我向您展示的代码处理。

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

<强> FIRST:

  • 创建一个返回有效且存在的外键的函数 这样的具体表格:
CREATE FUNCTION SelectMinForeignKey()
RETURNS INT
AS
BEGIN
  DECLARE @FirstID INT
  SELECT @FirstID = MIN(ID) from DetailTableExample01
  RETURN @FirstID
END

<强> SECOND:

  • 然后你应该改变你的表来添加这样的列:
ALTER TABLE example1 ADD NoNullableCol INT NOT NULL DEFAULT [dbo].SelectMinForeignKey()
  • 或立即添加关系:
  ALTER TABLE example1 
    ADD NoNullableCol2 INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey() ,
    FOREIGN KEY(NoNullableCol2) REFERENCES DetailTableExample01(id);
  • 或更多完成立即添加约束和可分配的FK名称:
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;
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

注意:如您所知,表和列名称是样本。

<强> THIRD:

  • 现在您应该根据需要更改NoNullableCol中的值

所有功能于一:

  • 整个查询都是这样的
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;

它完成了!

希望它能解决你的问题