MS SQL插入IDENTITY自增列指定DEFAULT报错,如何保留ID在插入列列表
解决方案
以下三种方案均可满足「INSERT语句保留ID列的同时兼容SQL Server IDENTITY自增列」的需求,可根据业务场景选择:
- 方案1:使用INSTEAD OF INSERT触发器适配
针对包含IDENTITY属性ID列的表创建替代插入触发器,触发器内部忽略传入的ID值,由数据库自动生成自增ID,触发器示例:
配置完成后原有插入语句CREATE TRIGGER trg_products_insert ON products INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO products (Name) SELECT Name FROM inserted; ENDINSERT INTO products (ID, Name) VALUES (DEFAULT, "ProductName")可直接正常运行,无需修改上层C++代码逻辑。 - 方案2:运行时获取元数据动态适配
接口加载表结构元数据时,通过系统函数判断ID列是否为自增属性,查询语句如下:
若返回值为1说明是IDENTITY自增列,可直接在拼接SQL时省略ID对应的值赋值,或手动查询当前最大ID计算下一个取值插入。SELECT COLUMNPROPERTY(OBJECT_ID('目标表名'), 'ID', 'IsIdentity') AS is_identity; - 方案3:统一使用SEQUENCE实现跨库兼容
弃用表级IDENTITY自增属性,全库统一使用SEQUENCE对象生成主键ID,所有表的插入语句统一写为:
该方案可实现MySQL、SQL Server等多数据源的插入逻辑完全统一,无需针对自增列做特殊判断,更适合通用数据库抽象接口的场景。INSERT INTO products (ID, Name) VALUES (NEXT VALUE FOR 全局ID序列名, "ProductName")
内容的提问来源于stack exchange,提问作者Lidbey
相关产品推荐
相关产品推荐

