【问题标题】:How can I insert identity manually?如何手动插入身份?
【发布时间】:2012-09-24 10:52:03
【问题描述】:
CREATE TABLE masterTbl (
id INT IDENTITY(1,1) CONSTRAINT pk_id PRIMARY KEY,
name VARCHAR(100))

INSERT INTO masterTbl VALUES ('ABC', 'XYZ','PQR')

现在

Select * FROM masterTbl

结果:

id  | name
---------------------
1 |  ABC
2 |  XYZ
3 |  PQR

DELETE FROM masterTbl WHERE id=1

现在

Select * FROM masterTbl

结果:

id |  name
---------------------
2 |  XYZ
3 |  PQR

现在我要运行:

INSERT INTO masterTbl (id, name) VALUES (1, 'MNO')

这怎么可能?

【问题讨论】:

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


【解决方案1】:

以最简单的形式,您需要暂时允许插入标识值

SET IDENTITY_INSERT masterTbl ON
INSERT INTO masterTbl (id, name) VALUES (1, 'MNO')
SET IDENTITY_INSERT masterTbl OFF

【讨论】:

  • 设置 identiy on 或 off,SQL 发出同样的模棱两可的错误:“只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 'X' 中的标识列指定显式值”
  • @alejandrob - 我建议有 60 个赞成票(我假设你是我对这个答案的第一个反对票)我的例子不是问题......检查你是否实际列出正确的列
【解决方案2】:

是的,您可以手动执行设置身份字段

SET IDENTITY_INSERT masterTbl ON

然后插入你的数据

INSERT INTO masterTbl (id, name) VALUES (1, 'MNO') 
......

记得打电话

SET IDENTITY_INSERT masterTbl OFF

重新启用正确的功能

【讨论】:

    【解决方案3】:
    【解决方案4】:

    可以执行以下步骤:

    我。启用标识插入,这将禁止 SQL Server 在表的标识列中自动插入值:

    SET IDENTITY_INSERT ON
    

    二。执行“手动”插入操作,指定所有受影响的列名:

    INSERT INTO masterTbl (id, name)
    VALUES (1, 'ABC',
            2, 'XYZ',
            4, 'PQR')
    
    • 如果您跳过列出列名,SQL Server 将弹出错误消息。

    三。完成后,通过禁用之前的手动插入功能重新启用自动标识值插入:

    SET IDENTITY_INSERT OFF
    

    四。大功告成!

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2012-09-28
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多