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

Posted

技术标签:

【中文标题】如何在 sql server 中设置外键列的默认值?【英文标题】:How do I set default value for a foreign key column in sql server? 【发布时间】:2013-07-15 19:28:27 【问题描述】:

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

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

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

【问题讨论】:

使用 FK_ 前缀命名默认约束是一种不好的做法。 你建议我给它取什么名字? DF_group_type 例如,因为FK_ 前缀通常用于命名foreign key 约束并且可能会误导 哦,看起来我实际上并没有创建 FOREIGN KEY 约束..这是我想做的 对于新手,您可以在一个 ALTER TABLE 命令中完成所有这些操作,更多信息,check out my answer below。 【参考方案1】:

首先,向列添加 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)

【讨论】:

ALTER TABLE group ADD CONSTRAINT fk_groupType FOREIGN KEY (group_type_id) REFERENCES group_type (group_type_id)你是这样做的吗? 试过了,但我得到了以下错误:Msg 1769, Level 16, State 1, Line 2 Foreign key 'fk_groupType ' references invalid column 'group_type_id' in referencing table 'group'. Msg 1750, Level 16, State 0, Line 2 Could not create constraint. See previous errors.我是不是要先添加列? 谢谢。有两个ALTER TABLE 有什么原因吗?因为我在下面尝试过并且有效。我还设法得到它,因此列中的现有数据更改为 5 ALTER TABLE group ADD group_type_id INT NOT NULL DEFAULT (5) , CONSTRAINT fk_group_type FOREIGN KEY (group_type_id) REFERENCES group_type 六个一个,六个另一个。【参考方案2】:

这对我有用,它在单个 ALTER TABLE 语句中设置外键约束、默认值和更新现有表记录。我正在使用 SQL Azure 数据库(通过 SQL Management Studio),所以,YMMV。

ALTER TABLE Group
    ADD GroupTypeId int NOT NULL
    CONSTRAINT DK_GroupTypeId DEFAULT (5) WITH VALUES
    CONSTRAINT FK_GroupTypeId FOREIGN KEY
    REFERENCES [dbo].[GroupType] (GroupTypeId)

GO

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

免责声明:我将上述查询从我的表/键名编辑为您的,而没有重新测试,因此您可能需要仔细检查是否有任何拼写错误或其他不匹配;不过语法应该是一样的。

【讨论】:

【参考方案3】:

你可以使用:

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

【讨论】:

如果我这样做会更好/工作default(select id from group_type where desc ='typeA') 吗? 不允许从其他表中查询数据作为默认值的来源。【参考方案4】:

如果您向表中添加新的不可为空的列,添加默认约束将影响现有行。

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

【讨论】:

以上是关于如何在 sql server 中设置外键列的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

怎么在SQL中设置外键

如何在 SQL Azure 中设置外键?

sql server如何添加外键

sql server如何添加外键

如何在MySQL中设置外键约束以及外键的作用

在 phpMyAdmin 中设置外键