添加一个新列并设置外键关系。

7 浏览
0 Comments

添加一个新列并设置外键关系。

我想在CDRLive中添加一个名为\'IPkey\'的新列,它是ACIPin中的主键\'pkey\'。\npkey是bigint类型,不能为空。\n

ALTER TABLE CDRLive ADD IPkey bigint NOT NULL
go
ALTER TABLE CDRLive
ADD CONSTRAINT CDRLive_IPkey FOREIGN KEY(IPkey) REFERENCES ACIPin(pkey) 

\n失败。错误信息:\n

Msg 4901,级别 16,状态 1,第 2 行
ALTER TABLE 仅允许添加可以包含空值的列,或者具有指定默认值的列,或者要添加的列是标识或时间戳列。或者如果前面的条件都不满足,则该表必须为空以允许添加此列。由于不满足这些条件,因此无法将列'IPkey'添加到非空表'CDRLive'中。
Msg 1769,级别 16,状态 1,第 1 行
外键'CDRLive_IPkey'引用了引用表'CDRLive'中的无效列'IPkey'。
Msg 1750,级别 16,状态 0,第 1 行
无法创建约束。请参阅前面的错误。

0
0 Comments

问题的出现原因是想要在一个表中添加一个新的列,并且设置外键关联。解决方法是按照以下步骤进行操作:

1. 使用ALTER TABLE语句添加新的列,并设置为NULL

ALTER TABLE CDRLive ADD IPkey bigint NULL
go

2. 填充新列的数据。

3. 使用ALTER TABLE语句修改新列的约束为NOT NULL

ALTER TABLE CDRLive ADD IPkey bigint NOT NULL
go

4. 使用ALTER TABLE语句添加外键约束:

ALTER TABLE CDRLive
ADD CONSTRAINT CDRLive_IPkey FOREIGN KEY(IPkey) REFERENCES ACIPin(pkey)

第2步中,可以使用WHERE子句从ACIPin表中填充数据。确保操作的顺序是正确的。

如果你不在意旧数据,也可以按照graceemile所说的方法,在所有旧行中插入一个0,并且使用WITH NOCHECK子句创建外键。

需要注意的是,“GO”是一个非SQL本地的批处理终止符,可以根据需要进行修改,详细信息可以参考上面提到的答案链接。

0