如果具有指定值的同一表中存在重复键,则 MYSQL DELETE 行

Posted

技术标签:

【中文标题】如果具有指定值的同一表中存在重复键,则 MYSQL DELETE 行【英文标题】:MYSQL DELETE row if duplicate key exists in same table with specified value 【发布时间】:2016-07-19 14:45:14 【问题描述】:

这可能被标记为重复,但我无法在搜索中找到此示例。

我有一个允许重复键的产品到类别表,因此允许按 ID 将产品放置在多个类别中。我有一种情况,几千种产品被错误地放置在一个类别中。如果产品被分配给“动作人物”和“漫画”,那么“漫画”的分配是错误的。

我正在尝试编写一个单独的 mysql 查询,如果检测到具有重复键和“动作人物”的指定值的行,该查询将删除行。另一种说法:如果一个产品被分配到两个类别,那么我想删除将它分配给错误类别的行。

我似乎无法找出可以按照我想要的方式按 ID 在同一个表中搜索的删除语句。

这是我到目前为止所得到的(编辑-感谢下面的答案):

DELETE FROM oc_product_to_category c1
WHERE c1.category_id = '25'
AND EXISTS(
SELECT * FROM oc_product_to_category c2 
WHERE c1.product_id = c2.product_id AND c2.category_id = '24')

不幸的是,这会产生语法错误。

You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near 
'c1
WHERE c1.category_id = '25'
AND EXISTS (
SELECT * FROM oc_product_to_catego' at line 1

当我尝试语法时

DELETE c1 FROM oc_product_to_category c1 ...

我收到一个错误:

You can't specify target table 'c1' for update in FROM clause

【问题讨论】:

【参考方案1】:

这应该可以帮助您入门。如果为 category_id 25 和 33 都分配了一个 ID,它将删除类别为 25 的记录。

DELETE c1 FROM oc_product_to_category as c1
WHERE c1.category_id = '25'
AND EXISTS (
    SELECT id FROM (SELECT * FROM oc_product_to_category) as c2 
    WHERE c1.id = c2.id AND c2.category_id = '33'
)

请注意,这不会删除 category_id 为 33 的重复记录(如果存在)。

【讨论】:

我不知道您可以使用 2 个不同的别名来引用同一张表……无知又来了。是的,这些数字是任意的,但我正在尝试修复数据。实际值是 25 和 33,但不用担心。 这是一个非常有用的工具,用于比较表中的值。我已将 26 更新为 33。另外,如果它解决了您的问题,请将答案标记为已接受。 我编辑了我的问题,遇到语法错误,并且没有足够的 SQL 经验来破译它。另外,感谢您编辑您的答案。我第一条评论的最后一句话是针对另一条评论,后来被删除了。 在我的回答中尝试更新后的查询。我为 MySQL 限制添加了一个有点丑陋的解决方法,该限制阻止修改 select 语句中使用的同一个表。

以上是关于如果具有指定值的同一表中存在重复键,则 MYSQL DELETE 行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:如果表中不存在则插入记录[重复]

同一表中具有不同值的重复字段

如果不存在,mysql插入不起作用创建重复键

排序具有指定键值的数组PHP [重复]

MYSQL从另一个表更新数据,如果存在,否则插入[重复]

从单个表中检索具有不同值的同一列的多个输出时的性能问题