Как выполнить несколько обновлений с уникальным индексом в MySQL - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть следующая таблица с уникальным индексом по полю "position_in_list":

  CREATE TABLE `planned_operation` (
    `id` bigint(20) NOT NULL,
    `position_in_list` bigint(20) NOT NULL,
    `name` varchar(255) not null
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

  ALTER TABLE `planned_operation`
    ADD PRIMARY KEY (`id`),
    ADD UNIQUE KEY `position_in_list` (`position_in_list`);

  ALTER TABLE `planned_operation`
    MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

  INSERT INTO `planned_operation` (`id`, `position_in_list`, `name`) VALUES
  (1, 1, 'first'),
  (2, 2, 'second');

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

update planned_operation 
set position_in_list = case position_in_list 
    when 2 then 3
    when 1 then 2
end
where position_in_list in (1, 2)

Но при выполнении выдается ошибка:

#1062 - Duplicate entry '1' for key 'position_in_list'

Есть ли способ избежать ошибки? Без отключения уникального индекса

1 Ответ

1 голос
/ 18 апреля 2019

Вы хотите, чтобы отложенные ограничения.

К сожалению, MySQL не реализует отложенные проверки ограничений - неотъемлемая часть SQL, которую реализуют немногие механизмы баз данных.

Насколько мне известно, только PostgreSQL иOracle (частично) действительно реализует их.

Проще говоря, это означает, что MySQL проверяет уникальное ограничение на каждое изменение одной строки внутри оператора UPDATE.С отложенными ограничениями вы можете отложить эту проверку до конца оператора или даже до конца транзакции базы данных.

Теперь вам нужно будет переключиться на PostgrSQL или Oracle, чтобы отложить проверки ограничений до концаутверждение (как вы, кажется, хотите).Полагаю, это для вас выход за рамки, но это теоретический вариант.

Для более глубокого обсуждения вы можете посмотреть Ответ по отложенным ограничениям .

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