首页 文章

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

提问于
浏览
141

我的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 回答

  • 19

    limit 添加到delete查询中

    delete from orders 
    where id_users = 1 and id_product = 2
    limit 1
    
  • 5

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

  • 60

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

    我会给出其他方式:

    我看到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;
    
    • 再次创建表格

    如果有多个行具有重复值,则还可以重新创建表

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

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

    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)
    
  • 184

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

  • 1

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

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

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

相关问题