【问题标题】:SQL Cannot insert explicit value for identity column in table 'Table' when IDENTITY_INSERT is set to OFF [duplicate]当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“表”中插入标识列的显式值 [重复]
【发布时间】: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) АССОРТ.');

请告诉我为什么会出错以及如何正确插入数据?

【问题讨论】:

  • 这里已经回答了一个类似的问题:stackoverflow.com/questions/1334012/…
  • 错误信息有什么不清楚的地方?
  • @learner 在插入之前将IDENTITY_INSERT 转为ON
  • 或者不要在IDENTITY 列中插入显式值!让 SQL Server 处理那些自动递增的值!

标签: sql sql-server sql-server-2008


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 2016-08-18
    • 2019-03-10
    • 2014-02-24
    • 2011-08-26
    • 2017-12-17
    相关资源
    最近更新 更多