【问题标题】:Removing a Mysql record删除 Mysql 记录
【发布时间】:2014-07-29 06:21:11
【问题描述】:

我在产品的 mysql 表中有几千个产品。

每个产品都有一个以整数形式存储其制造商 [制造商] 的字段 - 制造商 'id'。

随着时间的推移,一些制造商已从“制造商”表中删除,但产品已成为孤立产品。

我是否可以运行一个查询来删除所有孤立的产品。

有点像

'删除 products.manufacturer 不匹配的所有产品 制造商.id'。

一个更复杂的问题。一个产品可以有多个制造商,因此 products.manufacturer 可以有类似 '1|75|432' 的数据,其中每个制造商有 1、75、432。

谢谢

【问题讨论】:

  • 如果可以的话,改变你的桌子设计是个好主意。具有字符分隔列表的列在大多数情况下会产生很多麻烦。
  • 如果产品有 3 个制造商,但只有一个被删除了怎么办?你也删除它吗?

标签: mysql sql-delete


【解决方案1】:

试试这个,

DELETE FROM product 
WHERE product_id not in (
    SELECT distinct p.product_id FROM Product p, manufacturer m 
    WHERE p.manufacturer REGEXP '[[:<:]]' + m.manufacturer_id + '[[:>:]]'
);

PS:这将只删除那些记录,列表中的所有制造商都已删除

【讨论】:

    【解决方案2】:

    您可以将FIND_IN_SETREPLACE 结合使用

    DELETE
        p
    FROM
        products p
    LEFT JOIN
        manufacturer m
    ON
        FIND_IN_SET(m.id, REPLACE(p.manufacturer, '|', ','))
    WHERE
        m.id IS NULL
    

    说明:

    您必须先将您的限制器| 替换为 FIND_IN_SET 可使用的唯一限制器,即逗号,。如果制造商表中没有匹配的制造商,那么您的制造商表的 id 列的值)将为 NULL。

    DELETE语法:

    前面的例子使用了INNER JOIN,但是多表DELETE 语句可以使用 SELECT 语句中允许的其他类型的连接, 例如左连接。例如,要删除 t1 中存在的行 在 t2 中没有匹配项,请使用 LEFT JOIN:

    在 t1.id=t2.id WHERE t2.id 为 NULL 的情况下,从 t1 LEFT JOIN t2 中删除 t1;

    请参阅this fiddle 了解 SELECT 语句。

    注意

    正如我在评论中所说,最好更改数据库设计。一个产品可以有多个制造商,一个制造商可以生产多个产品,junction table 的经典案例。

    【讨论】:

      【解决方案3】:

      你应该做很多初步的事情:

      1) 改变表格设计,tab限制多个值不好 想法,实际上在你必须加入它的价值的情况下。

      Sol:更改制造商 ID 以仅容纳单个值(FK 带有制造商 ID 表)。

      2) 你需要一些脚本来插入多行不同的 选项卡式值。

      无论如何你都需要这个来保存剩余的记录。

      3) 现在我们可以加入制造商和产品表。

      您现在可以对制造商进行左连接产品以有效地完成其他任务。

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 2011-11-20
        • 2014-10-07
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 2011-02-22
        • 2010-11-10
        • 2016-10-16
        相关资源
        最近更新 更多