如何从具有相同列值的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_users
和id_product
是来自不同表的外键。
我想要的只是删除一行:
1 2 1 2013
它出现两次,所以我只是想删除它。
我试过这个查询:
delete from orders where id_users = 1 and id_product = 2
但它会删除它们(因为它们是重复的)。 任何提示解决这个问题?
为删除查询添加一个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)
devise表格的最佳方法是添加一个临时行作为自动增量并保持为主键。 所以我们可以避免这样的问题。
已经LIMIT
删除行的答案。 理想情况下,你应该有你的表中的主键。 但如果没有。
我会给其他方式:
- 通过创build唯一索引
我看你的例子中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;
- 再次创build表
如果有多个行具有重复值,那么您也可以重新创build表
RENAME TABLE `orders` TO `orders2`; CREATE TABLE `orders` SELECT * FROM `orders2` GROUP BY id_users, id_product;