2010-12-12 31 views
1

我有一个表“order_item”与 ORDER_ITEM_ID INT ORDER_ID INT如何删除行(不是自动递增)

主键后重新序列的id列是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?我曾尝试以下,但总是收到重复键错误,并不断变化的第一个找到的项目编号为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

你使用Oracle? MySQL的? – ClosureCowboy 2010-12-12 04:28:58

+0

谢谢!由于“:=”的作业,我会假设Vijer使用MySql。如果SQL Server允许这些,我会考虑我的想法! – ClosureCowboy 2010-12-12 04:32:53

+0

对不起,是的MySQL – Vijer 2010-12-12 05:04:29

回答

0

您只能对那些大于刚被删除的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)

+0

像这样修改,我仍然得到一个重复键错误。 order_item_id每次都被设置为0。

SET @i := 3 - 1; UPDATE order_item SET order_item_id = (@i := @i + 1) WHERE order_id = 7 AND order_item_id > 3
Vijer 2010-12-12 05:02:16

+0

我不确定,但我认为(@i:= @i + 1)正在返回一个0.也许你不能这样做?我不知道。这是哪个数据库? – harithski 2010-12-12 05:08:24

+0

查询很好,但我使用SQLyog编辑并执行查询,然后将它们合并到PHP中,显然SQLyog并未一起执行这两个语句,因此@i未设置且不递增。 – Vijer 2010-12-12 05:28:27

0

实际使用hartihski的建议修改后的代码工作的增量,但必须与SQLyog的执行查询的一个问题。当我使用phpMyAdmin执行查询时,它按预期工作。

+0

其实这个代码在MyPHPAdmin中完美工作,只是不在SQLyog.SET @i:= 0; UPDATE order_item SET order_item_id =(@i:= @i + 1) WHERE order_id = 7 – Vijer 2010-12-12 05:31:52

2

只是不要混淆id和数字排序,你不会有问题。后者甚至可以在客户端轻松完成。更改主键是一个非常糟糕的主意。

1

为了增加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;