SQL ОБНОВЛЕНИЕ установлен и идентификатор с другим значением идентификатора мин - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь обновить таблицу. У меня есть те же данные, но с разными идентификаторами, поэтому я хотел бы установить идентификатор обоих коммун на самый низкий регистр идентификаторов для результатов.

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

Япоявляется следующая ошибка:

Сообщение 8102, уровень 16, состояние 1, строка 1 Не удается обновить столбец идентификатора 'EXAMPLEID'

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Столбец идентификации обычно используется со столбцом первичного ключа.В вашем случае, если ExampleID является вашим первичным ключом, а также столбцом идентификатора, вы не можете иметь один и тот же ExampleID в двух разных строках.

Столбец первичного ключа уникален для каждой строки

С другой стороны, если столбец не PK, а столбец идентификаторов, то SQL Server не позволяет обновлять значение столбца идентификаторов.

Но есть грязная альтернатива для этого (не рекомендуется)

0 голосов
/ 08 февраля 2019

Вы не можете обновить столбец идентификаторов.Вы можете вставить новые записи с явным значением, используя 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
    

Возможно, вам потребуется повторно заполнить удостоверение с помощьюправильное значение после вставки строк, если вы хотите сохранить то же начальное значение, что и раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...