【问题标题】:Toggle insert identity with single statement使用单个语句切换插入标识
【发布时间】:2019-09-05 09:55:20
【问题描述】:

对于在场上非常懒惰的人:是否有一个 single 语句可以将IDENTITY INSERT sometable 从开启切换到关闭,反之亦然?

【问题讨论】:

  • 不,没有单行可以做到这一点。你可以用支票把它包起来(比如this),但这对我来说似乎超级危险。
  • 将其显式设置为 ONOFF 更好,原因有很多,而且几乎不繁琐
  • 我认为任何自动生成的值都不应该具有任何商业意义,因此除了极少数定义明确的情况外,您根本不应该使用`set identity insert。跨度>
  • 这听起来像XY Problem。有一个问题 X(也许是批量进口?)有人认为 Y 是解决方案(切换身份)。当这不起作用时,问题是关于 Y,而不是实际问题 Y。实际问题是什么?

标签: sql-server tsql identity-insert


【解决方案1】:

不,没有“toggel identity_insert”声明,并且有充分的理由:

由数据库自动生成的值不应具有任何商业意义。

使用标识列作为代理键,可以帮助您在数据库中保持简单,但将业务意义归因于数据库为您生成的值是错误的 - 导致人们提出"How to fix the gaps in my identity column" 之类的问题的原因(我个人最喜欢的答案是 Aaron Bertrand 的 this one)。

事实上,自动生成的值是非常有用的工具,当您只按照它们的设计用途使用它们时 - 并且标识列旨在提供一个简单的行标识符,该标识符按顺序递增(或递减)行被插入到表中。

因此,set identity_insert 应该只在极少数情况下使用——事实上,除了将数据从一个表复制到另一个表之外,当你想准确地保留原始值时——我什至想不出另一个set identity_insert 有用的情况。

结合每个会话只能有一个表处于 identity_insert 状态这一事实,您应该能够很容易地理解为什么您不希望看到类似 toggle identity_insert 之类的东西,这充其量是模棱两可的。

tl;dr; 鉴于set identity_insert 语句的使用次数有限,而且它的局限性,使用toggle identity_insert 语句是一个非常糟糕的主意。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2012-03-19
    • 1970-01-01
    • 2014-08-24
    • 2014-03-31
    相关资源
    最近更新 更多