【问题标题】:Why does one have to specify columns when IDENTITY_INSERT ON? [duplicate]为什么必须在 IDENTITY_INSERT ON 时指定列? [复制]
【发布时间】:2019-05-09 21:42:39
【问题描述】:

以下脚本执行失败

SET IDENTITY_INSERT dbo.MyTable ON

-- the table only has three columns, so there's no ambiguity
INSERT INTO dbo.MyTable
VALUES (1, 2, 3)

SET IDENTITY_INSERT OFF

这会引发以下警告:

表“dbo.MyTable”中标识列的显式值 只能在使用列列表并且 IDENTITY_INSERT 时指定 已开启。

当列明确时,脚本会按预期执行。

SET IDENTITY_INSERT dbo.MyTable ON

INSERT INTO dbo.MyTable (ColA, ColB, ColC)
VALUES (1, 2, 3)

SET IDENTITY_INSERT OFF

为什么必须使用列列表?

【问题讨论】:

  • 您必须为您的 INSERT 语句制作一个列列表,而不是像“INSERT Into tableA Values ()”
  • 你问了“为什么”,然后接受了一个不涵盖该问题的重复问题,所以我不知道你的预期问题是什么
  • 问微软为什么让产品以某种方式工作并不总能得到有意义的答案:)
  • 只是猜测,但是。考虑像@​​987654323@ 这样的表和像insert into t values (1,2) 这样的(合法)语句。如果 IDENTITY_INSERT 为 ON,列映射是否应该更改?

标签: sql sql-server database ssms identity-insert


【解决方案1】:

安全。这样可以确保您确实指定了 id 列,否则如果您错误地将 IDENTITY_INSERT 设置为 ON,您可能会在很大程度上弄乱您的表。

【讨论】:

  • 我不太认同这个解释。您如何不小心为会话中的表启用了IDENTITY_INSERT,并指定了一个额外的列,而不是通常接受的带有列列表的插入?为什么DROP DATABASE 没有任意障碍要清除,因为这是一个更危险的命令?
  • 如果我没记错的话,就是阻止你在该列中输入重复值。通常,当任何应用程序写入该表时,列(值)的标识将是自动的增加了..可能是因为此列是主键或主键的一部分,或者此列中的值需要是唯一的。由于您可以通过手动输入轻松打破这一点,因此您必须将 Identity_Insert 设置为 ON。跨度>
  • @Harry 是的,这就是必须 SET IDENTITY_INSERT 的解释 - 但问题是为什么这样做后语法会指定 column_list must be used`
  • 请记住,标识列不必是表的第一列。确保用户指定列列表是一个很好的做法,无论 IDENTITY_INSERT 是打开还是关闭,但特别是在您弄乱数据库完整性的情况下,将其设为强制性是有意义的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多