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; |
完成了!
希望它能解决你的问题