Обновите первичный ключ, не вызывая нарушения уникального ключа - PullRequest
3 голосов
/ 18 марта 2011

Я только что пришел к этой очень простой ситуации, когда мне нужно было сдвинуть первичный ключ на определенное значение.Предположим, что следующая таблица:

CREATE TABLE Test (
 Id INTEGER PRIMARY KEY,
 Desc TEXT);

Загружается со следующими значениями:

INSERT INTO Test VALUES (0,'one');
INSERT INTO Test VALUES (1,'two');

Если при попытке обновления первичного ключа произойдет сбой:

UPDATE Test SET Id = Id+1;

Ошибка: идентификатор столбца не является уникальным

Есть ли способ приостановить проверку уникальности до тех пор, пока не будет выполнен запрос на обновление?

Ответы [ 3 ]

7 голосов
/ 19 марта 2011

Найти хорошую точку поворота и перемещение данных вокруг этой оси. Например, если все ваши идентификаторы положительны, хорошим пивотом будет 0.

Когда вы обычно делаете

UPDATE Test SET Id = Id+1;

Сделайте эту последовательность вместо

UPDATE Test SET Id = -Id;
UPDATE Test SET Id = -Id +1;

Иногда вы можете найти аналогичную точку разворота, но формула немного сложнее.

1 голос
/ 18 марта 2011

без понимания фундаментальной проблемы (и, да, вы кажетесь жертвой кода и запускаете его!), Умножение идентификатора на наибольшее значение в таблице должно работать.

update test
set id = id * (select max(id) + 1 from test)

Однако, это грязно, и действительно, базы данных затрудняют изменение первичных ключей по причине ...

0 голосов
/ 19 марта 2011

OK.Вторая попыткаПопробуйте это:

  1. Получить MAX ключевого столбца.
  2. Таблица ОБНОВЛЕНИЙ Ключ SET = ключ + макс + 1
  3. Таблица ОБНОВЛЕНИЙ Ключ SET = ключ - макс.

Это позволит избежать дублирования ключей в любое время в процессе обновления, если переместить окно достаточно далеко.

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