如何从具有相同列值的mysql表中删除某一行?

时间:2013-08-22 10:40:30

标签: mysql delete-row

我的MySQL查询有问题。我的表有4列,看起来像这样:

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

但它会删除它们(因为它们是重复的)。有关解决此问题的任何提示吗?

6 个答案:

答案 0 :(得分:195)

delete查询

中添加limit
delete from orders 
where id_users = 1 and id_product = 2
limit 1

答案 1 :(得分:62)

所有表都应该有一个主键(由一列或多列组成),重复行在关系数据库中没有意义。您可以使用LIMIT来限制删除行的数量:

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

但这只是解决了您当前的问题,您肯定应该通过定义主键来处理更大的问题。

答案 2 :(得分:20)

您需要指定应删除的行数。在你的情况下(我假设你只想保留一个)这可以这样做:

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)

答案 3 :(得分:8)

设计表的最佳方法是将一个临时行添加为自动增量并保留为主键。所以我们可以避免上述问题。

答案 4 :(得分:5)

已经有LIMIT删除行的答案。理想情况下,您应该在表中使用主键。但如果没有。

我会给出其他方式:

  1. 创建Unique index
  2. 我看到id_users和id_product在你的例子中应该是唯一的。

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

    这些将删除具有相同数据的重复行。

    但是如果你仍然遇到错误,即使你使用IGNORE子句,试试这个:

    ALTER TABLE orders ENGINE MyISAM;
    ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
    ALTER TABLE orders ENGINE InnoDB; 
    
    1. 再次创建表格
    2. 如果有多个行具有重复值,则还可以重新创建表

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

答案 5 :(得分:1)

您必须为每行添加一个自动递增的ID,之后您可以通过其ID来删除该行。 所以你的表每行都有一个唯一的id和id_user,id_product ecc ...