Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从mysql表中删除具有相同列值的某一行?_Mysql_Delete Row - Fatal编程技术网

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

如何从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

我在MySQL中的查询有问题。我的表有4列,看起来像这样:

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个字节!