我需要将NOT NULL列添加到现有(已填充)表中,该表将是另一个表的外键。这带来了两个问题:
添加列时,其值不能为null - 使用默认值不是一个选项(除非稍后删除),因为当用户输入新的时,数据库逻辑用于服务器端验证记录,即当应用程序尝试使用具有空值的此字段添加记录时,数据库会引发应用程序捕获并返回给用户的错误,提示他们更正错误。
该列具有外键约束,这意味着它的值也必须存在于外表中。
最好的方法是什么?
答案 0 :(得分:16)
创建列,但允许NULL。 使用外键表中的正确数据填充列。 更改列添加非空。 添加外键约束。
答案 1 :(得分:1)
关于你的部分问题(经过多年的经历):
1 。如果您的意思是默认值非常聪明,并且您将来不需要更改它,那么您的愿望是错误的。为什么呢?
有两个原因:
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);
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:强>
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;
它完成了!
希望它能解决你的问题