Как повторно упорядочить столбец идентификатора после удаления строки (НЕ АВТОМАТИЧЕСКИЕ) - PullRequest
1 голос
/ 12 декабря 2010

У меня есть таблица 'order_item' с order_item_id int order_id int

первичный ключ - order_item_id + order_id

Таким образом, order_item_id не является уникальным и не является order_id, но является комбинациейдва столбца уникальны.

Если клиент добавляет несколько товаров в свой заказ, у нас может быть такая таблица

order_item_id   order_id
------------------------
1                5
2                5
3                5
4                5

... и если клиент затем удаляет order_item_id 2, тогдаэто пробел в последовательности.Order_item_id отображается для справки клиентов и используется при отправке заказов на покупку поставщикам.

Есть ли способ повторно упорядочить order_item_id для определенного order_id?Я пробовал следующее, но получаю сообщение об ошибке дубликата ключа, и оно продолжает изменять идентификатор первого найденного элемента на 0, а не 1.

SET @i := 0;

  UPDATE order_item
     SET order_item_id = (@i := @i + 1)
   WHERE order_id = 5
ORDER BY order_id, order_item_id

Спасибо за любую помощь.

Ответы [ 4 ]

2 голосов
/ 12 декабря 2010

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

1 голос
/ 12 декабря 2010

Добавить к комментарию newtover :

Изменение первичного ключа строки только для целей отображения является очень плохой идеей. Вы всегда можете сгенерировать «номер строки» на лету на стороне клиента.

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

К сожалению, MySQL не поддерживает функцию row_number (), но это можно обойти, используя следующий «хак»:

SELECT @rownum := @rownum + 1 as order_item_sequence, 
       o.order_item_id,
       o.order_id,
FROM order_table o,
  (SELECT @rownum := 0) r
WHERE o.order_id = 42;  
0 голосов
/ 12 декабря 2010

На самом деле модифицированный код, использующий предложения Хартихски, работает, но должна быть проблема с SQLyog, выполняющим запрос.Когда я использовал phpMyAdmin для выполнения запроса, он работал как положено.

0 голосов
/ 12 декабря 2010

Вы можете сделать это только для тех order_item_ids, которые больше, чем тот, который был только что удален.

Первый set @i := deleted_order_item_id - 1;

И добавить предложение where что-то вроде where order_item_id > deleted_order_item_id иувеличение с использованием order_item_id = (@i := @i + 1)

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