2013-08-22 77 views
130

我在MySQL中遇到了一個問題。我的表有4列,它看起來是這樣的:如何從具有相同列值的mysql表中刪除某一行?

id_users id_product quantity date 
1    2    1  2013 
1    2    1  2013 
2    2    1  2013 
1    3    1  2013 

id_usersid_product來自不同表的外鍵。

我要的是隻刪除一行:

1  2  1 2013 

出現了兩次,所以我只是想刪除它。

我已經試過此查詢:

delete from orders where id_users = 1 and id_product = 2 

但它會刪除他們兩人(因爲它們是重複的)。解決這個問題的任何提示?

回答

167

添加limitdelete查詢

delete from orders 
where id_users = 1 and id_product = 2 
limit 1 
+2

這隻會刪除一行。如果有3個用戶和產品ID,則2將保留。 – Rob

+8

是的,OP說(s)他想刪除1行。這是我的查詢所做的。 –

+2

是的,但我認爲這不是他/她想要的。 – Rob

57

所有的表都應該有一個主鍵(由單個或多列),重複行就沒有意義了在關係數據庫中。您可以使用限制雖然LIMIT刪除的行數:

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1 

但是,這只是解決您的本期,你一定要在更大的問題通過定義主鍵工作。

+0

發現它,謝謝你們! – Dani

+1

這很好的提及主鍵在關係數據庫中應該是唯一的。 – Paul

+1

@保羅這正是我要說的。但不要忘記獨特的鑰匙不一定意味着主鑰匙。 –

17

您需要指定應該刪除的行數。你的情況(我假設你只是想保持一個),這是可以做到這樣的:設計表

DELETE FROM your_table WHERE id_users=1 AND id_product=2 
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2) 
+0

謝謝Rob,但是沒有...我只想刪除一行,而不是隻保留一行 – Dani

+0

這在5.5.40中不適用於我,它會引發語法錯誤。正如在這裏提到的:http://stackoverflow.com/a/578926/1076075,看起來我們不能使用子查詢來指定LIMIT子句的值。對於任何想以這種方式進行操作的人,請查看:http://stackoverflow.com/q/578867/1076075 –

6

最好的辦法是增加一個臨時一行作爲自動遞增,並保持作爲主鍵。所以我們可以避免上述問題。

+1

或者是一個永久性的行。我知道這是一個古老的問題,但我應該說。身份證是用於這種情況。如果你擔心空間:一個BIGINT只有8個字節! –

3

已經有刪除行LIMIT的答案。理想情況下,你應該在你的表中有主鍵。但如果沒有。

我會給其他方法:

  1. 通過創建Unique index

我看到id_users和id_product應該在你的例子是獨一無二的。

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product) 

這將刪除與同一數據重複的行。

但是,如果你仍然得到一個錯誤,即使你使用忽略條款,試試這個:

ALTER TABLE orders ENGINE MyISAM; 
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product) 
ALTER TABLE orders ENGINE InnoDB; 
  • 通過創建表再次
  • 如果有是具有重複值的多行,那麼您也可以重新創建表

    RENAME TABLE `orders` TO `orders2`; 
    
    CREATE TABLE `orders` 
    SELECT * FROM `orders2` GROUP BY id_users, id_product; 
    
    相關問題