我有一个表'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
感谢您的帮助。
答案 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执行查询时,它按预期工作。