当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“表”中插入标识列的显式值 [重复]
Posted
技术标签:
【中文标题】当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“表”中插入标识列的显式值 [重复]【英文标题】:SQL Cannot insert explicit value for identity column in table 'Table' when IDENTITY_INSERT is set to OFF [duplicate] 【发布时间】:2014-02-21 21:19:07 【问题描述】:Structure tables and result query on sqlfiddle
我想使用查询:
INSERT INTO Price (id_price, id_firm, id_city, name)
VALUES
('12002', '1429', '73041', 'АРЕНДА (ПРОКАТ) АВТОКРАНА Г/П 25Т'),
('12003', '1429', '73041', 'ПЛИТКА КЕРАМИЧЕСКАЯ ГРАНИТ (КЕРАМОГРАНИТ) АССОРТ.'),
('12004', '1429', '73041', 'РАБОТЫ ГРУЗОПОДЪЕМНЫЕ АВТОВЫШКА (ПОДЪЕМНИК)'),
('12005', '1429', '73041', 'РАБОТЫ ГРУЗОПОДЪЕМНЫЕ АВТОКРАНОМ Г/П 25Т'),
('12006', '1429', '73041', 'РАБОТЫ КОМПРЕССОРОМ ВСЕ ВИДЫ'),
('12007', '1429', '73041', 'РАБОТЫ ПОГРУЗОЧНО-РАЗГРУЗОЧНЫЕ АВТОКРАНОМ-МАНИПУЛЯТОРОМ ГРУЖУ-ВОЖУ НА БАЗЕ ГАЗ Г/П 4Т'),
('12008', '1429', '73041', 'РАБОТЫ СПЕЦТЕХНИКОЙ ВСЕ ВИДЫ'),
('12009', '1429', '73041', 'РАБОТЫ СТРОИТЕЛЬНЫЕ ВСЕ ВИДЫ'),
('120010', '1429', '73041', 'ФОРСУНКА Д/КАМАЗ ДВИГАТЕЛЬ КАММИНС (CUMMINS) АССОРТ.');
但我得到错误:
Cannot insert explicit value for identity column in table 'Price' when IDENTITY_INSERT is set to OFF.:
INSERT INTO Price (id_price, id_firm, id_city, name)
VALUES
('12002', '1429', '73041', 'АРЕНДА (ПРОКАТ) АВТОКРАНА Г/П 25Т'),
('12003', '1429', '73041', 'ПЛИТКА КЕРАМИЧЕСКАЯ ГРАНИТ (КЕРАМОГРАНИТ) АССОРТ.'),
('12004', '1429', '73041', 'РАБОТЫ ГРУЗОПОДЪЕМНЫЕ АВТОВЫШКА (ПОДЪЕМНИК)'),
('12005', '1429', '73041', 'РАБОТЫ ГРУЗОПОДЪЕМНЫЕ АВТОКРАНОМ Г/П 25Т'),
('12006', '1429', '73041', 'РАБОТЫ КОМПРЕССОРОМ ВСЕ ВИДЫ'),
('12007', '1429', '73041', 'РАБОТЫ ПОГРУЗОЧНО-РАЗГРУЗОЧНЫЕ АВТОКРАНОМ-МАНИПУЛЯТОРОМ ГРУЖУ-ВОЖУ НА БАЗЕ ГАЗ Г/П 4Т'),
('12008', '1429', '73041', 'РАБОТЫ СПЕЦТЕХНИКОЙ ВСЕ ВИДЫ'),
('12009', '1429', '73041', 'РАБОТЫ СТРОИТЕЛЬНЫЕ ВСЕ ВИДЫ'),
('120010', '1429', '73041', 'ФОРСУНКА Д/КАМАЗ ДВИГАТЕЛЬ КАММИНС (CUMMINS) АССОРТ.');
请告诉我为什么会出错以及如何正确插入数据?
【问题讨论】:
这里已经回答了一个类似的问题:***.com/questions/1334012/… 错误信息有什么不清楚的地方? @learner 在插入之前将IDENTITY_INSERT
转为ON
。
或者不要在IDENTITY
列中插入显式值!让 SQL Server 处理那些自动递增的值!
【参考方案1】:
SET IDENTITY_INSERT Table_Name ON;
GO
/* Do your Inserts */
SET IDENTITY_INSERT Table_Name OFF;
GO
注意
这不是一个好的做法,根本不建议这样做。你很可能会结束 具有重复值,因此让标识列生成值 为你。如果您希望能够自己插入值,请执行 根本不让它成为一个标识列。
如果您在标识列中显式插入值,为确保您永远不会得到重复值,您可以在显式插入值后重新设置标识列值:
DBCC CHECKIDENT ('Table_Name', RESEED, 0); --<-- Reseed value to 0
GO
DBCC CHECKIDENT ('Table_Name', RESEED); --<-- Reseed value to next available value
GO
【讨论】:
我不完全同意你的说法。有时这样做很方便,例如在设置应用程序初始数据的 ref 数据脚本中(例如,当它第一次安装时)。想象一下,您的应用程序允许通过前端添加用户(因此您需要一个身份列),但您想从(例如)管理员用户开始,因此您有一个初始脚本来设置它。您可能需要稍后在脚本中将此用户的 ID 用作另一个表中的外键,因此您需要明确指定它。 @MartinWilson 同意了。有时这是唯一的方法,但我已在best practice
上向 OP 提供建议,特别是有时您别无选择。但是在我必须将值插入标识列的这种情况下,我会确保在使用 DBCC RESEED 命令插入后将值重新设置为下一个最高值,但我想对于一个简单的答案来说这将是太多的细节【参考方案2】:
如果这是错误:您可以执行截断并重新加载表或
SET IDENTITY_INSERT Tablename ON/OFF
【讨论】:
以上是关于当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“表”中插入标识列的显式值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
无法添加表行,因为“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Users' 中插入标识列的显式值”错误
IDENTITY_INSERT 设置为 OFF 的问题? :-/
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“企业”中插入标识列的显式值