SQL UPDATE集和具有另一个ID最小值的ID

时间:2019-02-08 09:08:13

标签: sql-server ssms

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

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

我遇到以下错误:

  

消息8102,级别16,状态1,行1无法更新标识列   “ EXAMPLEID”

2 个答案:

答案 0 :(得分:0)

您无法更新身份列。您可以使用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
    

如果要保留与以前相同的种子,则可能需要在插入行后使用适当的值重新设置标识。

答案 1 :(得分:0)

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

每行的主键列都是唯一的

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

但是有No parameterless constructor defined for this object. in ASP.NET MVC Controller