如何在sql server中设置外键列的默认值?

时间:2013-07-15 19:28:27

标签: sql-server foreign-keys sql-server-2012 constraints default

我在现有表中添加了一个带有预加载数据的新列。此列使用另一个表中的主键,我希望将其默认为 5 。我尝试了以下代码:

ALTER TABLE group
ADD group_type INT
GO
ALTER TABLE group
ADD CONSTRAINT FK_group_type DEFAULT 5 FOR group_type
GO

我期待更改表,然后所有值都将填充 5 ,而是填充NULL。我做错了什么?

4 个答案:

答案 0 :(得分:2)

首先,在列中添加DEFAULT约束(在它自己的SQL语句中)不会影响该列中的现有数据。它只对该表生成新的INSERTS,它不为该列提供值。

其次,你没有在这里创建一个FOREIGN KEY约束。

编辑:

这是正确创建FK的一种方法

ALTER TABLE group
ADD group_type_id INT
GO

ALTER TABLE group 
ADD CONSTRAINT fk_groupType FOREIGN KEY (group_type_id) 
REFERENCES group_type (group_type_id)

答案 1 :(得分:1)

您可以使用:

alter table [group]
    add group_type int constraint df_group_type default (5) with values

但是,使用常量作为列的默认值似乎不是一个好主意,该列应该是FK列。

看起来,实际上你可能想要做的是:

alter table [group] add column group_type int
GO
update [group] set group_type = (select id from group_type where desc ='typeA')
GO
alter table [group] add constraint FK_group_grouptype foreign key (group_type) references group_type (id)
GO

答案 2 :(得分:0)

如果向表中添加new not nullable列,则添加默认约束将影响现有行。

ALTER TABLE group
ADD group_type INT NOT NULL
CONSTRAINT DK_group_type DEFAULT 5
GO

答案 3 :(得分:0)

这对我有用,它在一个List<>语句中设置外键约束,默认值和更新的现有表记录。我使用SQL Azure数据库(通过SQL Management Studio),因此,YMMV。

ALTER TABLE

运行需要一段时间,但后续选择显示行具有这些列的正确默认值。

免责声明:我将上述查询从我的表/密钥名称编辑到您的名称而不进行重新测试,因此您可能需要仔细检查是否有任何拼写错误或其他不匹配;语法应该是相同的。