添加一个新列并设置外键关系。
添加一个新列并设置外键关系。
我想在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 行 无法创建约束。请参阅前面的错误。
问题的出现原因是想要在一个表中添加一个新的列,并且设置外键关联。解决方法是按照以下步骤进行操作:
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本地的批处理终止符,可以根据需要进行修改,详细信息可以参考上面提到的答案链接。