如何在删除行后重新排序id列(NOT AN AUTO-INCREMENT)

时间:2010-12-12 04:24:23

标签: sql mysql sequence

我有一个表'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_id重新排序order_item_id?我尝试了以下但是不断收到重复键错误,并且不断将第一个找到的项目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 个答案:

答案 0 :(得分:2)

请勿在订购时混淆ID和数字,否则您将无法解决问题。后者甚至可以在客户端轻松完成。更改主键是一个非常糟糕的主意。

答案 1 :(得分:1)

添加到 newtover 的评论:

仅出于显示目的更改行的主键是一个非常错误的想法。您始终可以在客户端动态生成“行号”。

如果您需要在数据库端执行此操作,则可以在检索期间执行此操作。无需更改主键。

不幸的是MySQL不支持row_number()函数,但是这可以使用以下“hack”解决:

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;  

答案 2 :(得分:0)

您只能为那些大于刚刚删除的order_item_id执行此操作。

首先set @i := deleted_order_item_id - 1;

添加一个类似where order_item_id > deleted_order_item_id的where子句 并使用order_item_id = (@i := @i + 1)

进行增量

答案 3 :(得分:0)

实际上使用hartihski建议的修改后的代码有效,但SQLyog执行查询时一定存在问题。当我使用phpMyAdmin执行查询时,它按预期工作。