2010-12-12 36 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;