155

我在 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_users并且id_product是来自不同表的外键。

我想要的是只删除一行:

1     2     1    2013

出现两次,所以我只想删除它。

我试过这个查询:

delete from orders where id_users = 1 and id_product = 2

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

4

6 回答 6

209

添加一个limit删除查询

delete from orders 
where id_users = 1 and id_product = 2
limit 1
于 2013-08-22T10:43:41.837 回答
64

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

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

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

于 2013-08-22T10:43:49.000 回答
20

You need to specify the number of rows which should be deleted. In your case (and I assume that you only want to keep one) this can be done like this:

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)
于 2013-08-22T10:46:31.983 回答
8

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

于 2013-08-22T12:36:59.680 回答
5

已经有Deleting row by 的答案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;
于 2016-08-23T13:12:46.817 回答
1

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

于 2018-05-31T08:38:57.633 回答