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

我在 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

但是它会删除它们(因为它们是重复的)?

536049 次浏览

删除查询添加 limit

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

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

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

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

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

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)

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

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

我会给出其他方式:

  1. 通过创建 唯一索引

在您的示例中,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. 通过再次创建表

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

RENAME TABLE `orders` TO `orders2`;


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

您必须为每一行添加一个自动递增的 id,然后您可以根据该行的 id 删除该行。 因此表中的每一行都有一个惟一的 id,id _ user、 id _ product ecc..。