【问题标题】:SQL UPDATE set and ID with another ID min valueSQL UPDATE 集和 ID 具有另一个 ID 最小值
【发布时间】:2019-02-08 09:08:12
【问题描述】:

我正在尝试更新一个表,我有相同的数据但具有不同的 ID,所以我想将两个 communs 的 ID 设置为结果的最低 ID 寄存器。

  UPDATE TABLENAME
      SET EXAMPLEID = LOWER(EXAMPLEID)
      WHERE
      TID = TID
      AND
      KID = KID
      AND 
      STREET = STREET

我收到以下错误:

消息 8102,级别 16,状态 1,第 1 行无法更新标识列 '示例'

【问题讨论】:

  • mysql 或 sql-server ???不一样
  • 样本数据和预期结果会很好。您还标记了 MySQL 和 SQL Server (2008)。我假设您正在使用 SQL Server,但请为您实际使用的 RDBMS 编辑标签。 MySQL 和 SQL Server 完全不同的产品。
  • 你不会得到重复的结果 - 通常是不受欢迎的。
  • @scaisEdge 已修复,谢谢 :)
  • 我得到的是:Msg 8102,Level 16,State 1,Line 1 无法更新身份列“EXAMPLEID”。

标签: sql-server ssms


【解决方案1】:

标识列通常与主键列一起使用。在您的情况下,如果 ExampleID 是您的主键也是身份列,则您不能在两个不同的行上有相同的 ExampleID。

主键列对于每一行都是唯一的

另一方面,如果您的列不是 PK 而是 Identity Column,则 SQL Server 不允许您更新 Identity Key Column Value。

但是有a dirty workaround alternative for this (Not Recommended)

【讨论】:

  • 有可能没有PK的身份,虽然不常见。
  • ExampleID 我不是我的主键
  • 我更新了我的答案。同样,您无法更新身份列
  • @Simonare 谢谢,我还在想到底该怎么做,但谢谢:D
【解决方案2】:

您无法更新标识列。您可以使用IDENTITY_INSERT 插入具有显式值的新记录,但SQL Server 不允许您进行更新。

如果您确实需要这样做,您唯一的选择是临时复制整个表格并使用更新后的值重新创建最终表格。 强烈不推荐

  1. 创建表的副本,其中包含所有相关对象(索引、约束等),但没有行(仅架构对象)。

    CREATE TABLE TABLENAME_Mirror (
        ExampleID INT IDENTITY,
        TID VARCHAR(100),
        KID VARCHAR(100),
        STREET VARCHAR(100))    
    
  2. 在这个新表上设置IDENTITY_INSERT ON 并插入具有更新值的记录

    SET IDENTITY_INSERT TABLENAME_Mirror ON
    
    INSERT INTO TABLENAME_Mirror (
        ExampleID,
        TID,
        KID,
        STREET)
    SELECT
        /*Updated values*/
    FROM
        --....
    
    SET IDENTITY_INSERT TABLENAME_Mirror OFF
    
  3. 删除原始表并将复制的表重命名为原始名称:

    BEGIN TRANSACTION
    
        IF OBJECT_ID('dbo.TABLENAME') is not null 
            DROP TABLE dbo.TABLENAME
    
        EXEC sys.sp_rename 
            'dbo.TABLENAME_Mirror', 
            'TABLENAME'
    
    COMMIT
    

如果您想保持与以前相同的种子,您可能需要在插入行后使用适当的值重新设置身份。

【讨论】:

  • 感谢所有我在思考新逻辑。不仅要更新,还要将列中的所需数据插入到另一个表中,并在插入后删除整个列。
  • 这取决于您要实现的业务逻辑。通常标识列没有商业价值,只是一个引用行的数字(它们应该始终以这种方式使用)。更新这样的专栏对我来说意义不大。也许你可以进一步解释这个值背后的逻辑。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2016-05-08
  • 2017-07-31
  • 2015-08-26
相关资源
最近更新 更多