当 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 时,无法在表“企业”中插入标识列的显式值

SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“任务”中插入标识列的显式值

当 IDENTITY_INSERT 设置为 OFF 时,无法在表中插入标识列的显式值