能否设置按ID插入为可选?开启IDENTITY_INSERT后兼容两种插入语句
两种INSERT语句共存的解决方案
完全可以让这两种插入方式同时生效,核心是按需切换IDENTITY_INSERT的开关状态——SQL Server对这个选项的规则很明确:
- 当
IDENTITY_INSERT设为ON时,你必须显式指定自增列(ID)的值才能插入数据; - 当它设为
OFF时(默认状态),数据库会自动用自增逻辑生成ID,此时你不用在INSERT语句里指定ID列的值。
具体操作步骤
1. 手动插入指定ID时
先打开开关,插入完成后立刻关闭:
-- 开启自增列手动插入权限 SET IDENTITY_INSERT TsiList ON; -- 执行带指定ID的插入 INSERT INTO TsiList (ID, something_else) VALUES (15, 'foo'); -- 用完务必关闭,避免影响后续自动插入 SET IDENTITY_INSERT TsiList OFF;
2. 让自增自动生成ID时
确保IDENTITY_INSERT处于关闭状态(默认就是OFF,只要你之前用完没忘关),直接执行不带ID的插入:
INSERT INTO TsiList (something_else) VALUES ('foo');
关键注意事项
- 同一数据库中,同一时刻只能有一个表的
IDENTITY_INSERT处于ON状态,所以手动插入完成后一定要及时关闭,否则其他表要开启这个选项会报错。 - 手动插入的ID不能和表中已存在的ID重复,否则会触发主键/唯一键冲突错误。
- 如果你担心忘记关闭开关,可以用事务包裹操作,确保开关成对执行,避免异常情况下状态紊乱:
BEGIN TRANSACTION; SET IDENTITY_INSERT TsiList ON; INSERT INTO TsiList (ID, something_else) VALUES (15, 'foo'); SET IDENTITY_INSERT TsiList OFF; COMMIT TRANSACTION;
内容的提问来源于stack exchange,提问作者Sven Engling
相关产品推荐
相关产品推荐

