删除Mysql记录

时间:2014-07-29 06:21:11

标签: mysql sql-delete

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

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

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

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

这样的东西
  

'删除products.manufacturer不匹配的所有产品   manufacturers.id'

另一个复杂因素。一个产品可以有多个制造商,所以products.manufacturer可以有这样的数据' 1 | 75 | 432' 其中每个制造商都有1,75,432个。

由于

3 个答案:

答案 0 :(得分:0)

试试这个,

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:这将仅删除那些已删除列表中所有制造商的记录

答案 1 :(得分:0)

您可以将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使用的唯一限制器|替换限制器,,首先是逗号{{1}}。如果制造商表中没有匹配的制造商,那么制造商表的id列的值将为NULL。

请参阅DELETE语法:

  

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

     

删除t1 FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE t2.id IS NULL;

请参阅this fiddle了解SELECT语句。

注意

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

答案 2 :(得分:0)

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

  1)更改表格设计,标签限制多个值不是很好   这个想法,事实上在你必须加入其价值的情况下。

     

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

     

2)你需要一些脚本来插入不同的多行   标签值。

     

无论如何,你需要这个来保留记录。

     

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

您现在可以在制造商处进行左连接产品,以便有效地执行其他任务。