【问题标题】:MSSql - Implicit & Explicit Identity INSERTMSSql - 隐式和显式身份插入
【发布时间】:2014-03-05 08:08:28
【问题描述】:

问题是:

有没有办法在同一个 INSERT 中同时指定隐式和显式身份?

INSERT INTO target (id, name)
VALUES
  (1, 'machin')
, (2, 'chouette')
, (3, 'trutruc')
, (NULL, 'chouchouette')
, (NULL, 'chose')
;

或者我必须进行 2 个不同的查询吗?

请查看my fiddle


上下文:我正在向用户展示此列表的内联编辑器,他可以在其中创建/更新/删除值。当他提交时,我正在替换这些值。由于这些值与其他对象相关,因此我尽量保留它们的 ID。

【问题讨论】:

  • 如果您发现自己关心分配在IDENTITY 列中的实际值,那么您可能用错了。它们应该只是不透明的 blob,恰好是唯一行的句柄。
  • 上下文是我正在编辑整个列表,同时尝试保留相关对象的 ID。

标签: sql-server sql-server-2012 uniqueidentifier sql-insert


【解决方案1】:

不,您必须使用单独的查询。甚至要插入IDENTITY 列,您必须转为IDENTITY_INSERT ON - 此时,您告诉服务器“相信我,我会提供适当的值”。

我尝试构建一个使用 IDENT_CURRENT 的查询并计算您的 NULL 的标识值,但无法保证 IDENT_CURRENT 被调用多少次以及它将返回什么值,因此很难产生与服务器在正常情况下产生的结果相同的结果。

【讨论】:

  • 感谢您回答最初的问题(否:)。所以你建议我应该 UPDATE 我有一个 id 的值和 INSERT 其他值,看起来确实合乎逻辑。
  • @PierredeLESPINAY - 是的,尽管您可能想考虑MERGE
  • 呵呵我不知道这个,好像很有趣
【解决方案2】:

当他提交时,我正在替换值。

这被称为严重的编程错误。

问题是身份是一个身份,如果您删除/插入而不是更新,请确保您永远无法使用参照完整性。 s RI 是拥有良好数据的核心基础 - 这种方法非常不利于生产。

这里的主要问题不是“插入特定值”而是“为什么要插入而不是更新”。

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 2019-10-31
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多