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

Dan*_*ani 152 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
Run Code Online (Sandbox Code Playgroud)

id_users并且id_product是来自不同表的外键.

我想要的是只删除一行:

1     2     1    2013
Run Code Online (Sandbox Code Playgroud)

哪个出现两次,所以我只想删除它.

我试过这个查询:

delete from orders where id_users = 1 and id_product = 2
Run Code Online (Sandbox Code Playgroud)

但它会删除它们(因为它们是重复的).解决这个问题的任何提示?

jue*_*n d 201

添加limit删除查询

delete from orders 
where id_users = 1 and id_product = 2
limit 1
Run Code Online (Sandbox Code Playgroud)

  • 是的,OP说他想删除1行.这就是我的查询. (10认同)
  • 这只删除一行.如果有3个用户和产品ID,那么2将保留. (3认同)
  • 谢谢Juergen.这就是我所需要的! (3认同)
  • OP真正需要做的是首先检查哪些行是重复的,然后删除重复项. (3认同)
  • 是的,但我认为这不是他/她想要的. (2认同)

dne*_*net 62

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

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*Rob 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)
Run Code Online (Sandbox Code Playgroud)


pra*_*ver 8

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


Som*_*luk 5

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

我会给出其他方式:

  1. 通过创建唯一索引

我看到id_users和id_product在你的例子中应该是唯一的.

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
Run Code Online (Sandbox Code Playgroud)

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

但是,如果仍然出现错误,即使您使用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; 
Run Code Online (Sandbox Code Playgroud)
  1. 通过再次创建表

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

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;
Run Code Online (Sandbox Code Playgroud)