如何自动将自增identity int列复制到另一列?附父列场景需求
解决方法:自动同步Identity列到另一列(无需存储过程)
嘿,这个需求我刚好踩过坑!首先得明确:SQL Server的DEFAULT约束没办法直接引用同一行的identity列——因为identity值是在插入操作后期才生成的,而DEFAULT约束是在插入前计算的,这时候myIdCol还没产生有效值。不过有几个更简便的替代方案,完全能满足你的需求:
方案1:使用计算列(适合不需要修改父级ID的场景)
如果你的copyOfMyIdCol只是用来标识行的父级(默认是自身),而且后续不需要修改这个值,那计算列是最省心的选择:
CREATE TABLE dbo.CopyOfIdColumn ( myIdCol INT IDENTITY(1,1) PRIMARY KEY, copyOfMyIdCol AS myIdCol PERSISTED NOT NULL )
AS myIdCol表示这个列的值始终和myIdCol保持同步PERSISTED会把计算值存储在磁盘上,避免每次查询都重新计算- 自动满足非空要求,完全不需要额外维护
方案2:使用AFTER INSERT触发器(适合需要后续修改父级ID的场景)
如果后续需要修改copyOfMyIdCol(比如把某行的父级改成其他行),那触发器是更灵活的方案,实现起来也很简单:
CREATE TABLE dbo.CopyOfIdColumn ( myIdCol INT IDENTITY(1,1) PRIMARY KEY, copyOfMyIdCol INT NOT NULL -- 这里不设DEFAULT,由触发器自动填充 ) GO CREATE TRIGGER TR_CopyOfIdColumn_Insert ON dbo.CopyOfIdColumn AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 把新插入行的copyOfMyIdCol设为对应的identity值 UPDATE c SET copyOfMyIdCol = c.myIdCol FROM dbo.CopyOfIdColumn c INNER JOIN inserted i ON c.myIdCol = i.myIdCol; END GO
插入数据时你只需要处理其他列(如果有的话),触发器会自动把copyOfMyIdCol设为当前行的identity值,而且后续你可以自由修改这个列的值。
补充:为什么DEFAULT约束不行?
SQL Server的DEFAULT约束只能使用常量、不依赖当前行的内置函数,或者确定性表达式。而identity列的值是在插入执行阶段才生成的,在计算DEFAULT值的环节,这个值还不存在,所以根本没法引用。
内容的提问来源于stack exchange,提问作者vbp13
相关产品推荐
相关产品推荐

