如何从mysql表中删除具有相同列值的某一行?
我在MySQL中的查询有问题。我的表有4列,看起来像这样:如何从mysql表中删除具有相同列值的某一行?,mysql,delete-row,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
id_users id_product quantity date
1 2 1 2013
1 2 1 2013
2 2 1 2013
1 3 1 2013
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)
id\u用户
和id\u产品
是来自不同表的外键
我只想删除一行:
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
但这正好解决了您当前的问题,您肯定应该通过定义主键来解决更大的问题。您需要指定应该删除的行数。在您的情况下(我假设您只想保留一个),可以这样做:
id_users id_product quantity date
1 2 1 2013
1 2 1 2013
2 2 1 2013
1 3 1 2013
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)
设计表的最佳方法是添加一个临时行作为自动增量,并将keep作为主键。因此,我们可以避免上述问题 通过LIMIT
删除行已经有了答案。理想情况下,表中应该有主键。但如果没有
我会提供其他方法:
通过创造
我认为id_用户和id_产品在您的示例中应该是唯一的
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;
您必须为每一行添加一个自动递增的id,然后您可以根据其id删除该行。
因此,表中的每一行都有一个唯一的id,id\u user,id\u product ecc…这只会删除一行。如果此用户和产品id有3个,则将保留2个。是的,OP表示他要删除1行。这就是我的问题。是的,但我认为这不是他/她想要的。谢谢你,尤尔根。这就是我所需要的!OP真正需要做的是首先检查哪些行是重复的,然后删除重复的行。谢谢Rob,但是没有。。。我只想删除一行,而不是只保留一行。这在5.5.40中对我不起作用,它抛出了一个语法错误。正如这里提到的:,似乎我们不能使用子查询来指定LIMIT子句的值。对于任何想用这种方式做事情的人,请检查以下内容:在关系数据库中,主键应该是唯一的,这一点很好。@Paul这正是我要说的。但别忘了,唯一键并不一定是主键,也不一定是永久行。我知道这是个老问题,但我想我应该说出来。身份证用于这种情况。如果您担心空间:BIGINT只有8个字节!