1

我正在使用预加载数据的现有表中添加一个新列。此列使用另一个表中的主键,我想将其默认为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

4 回答 4

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)
于 2013-07-15T19:35:53.160 回答
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

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

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

于 2017-10-04T20:13:04.637 回答
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
于 2013-07-15T19:42:37.640 回答
0

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

ALTER TABLE group
ADD group_type INT NOT NULL
CONSTRAINT DK_group_type DEFAULT 5
GO
于 2013-07-15T19:42:03.627 回答