如果具有指定值的同一表中存在重复键,则 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 行的主要内容,如果未能解决你的问题,请参考以下文章