删除Mysql记录

删除Mysql记录,mysql,sql-delete,Mysql,Sql Delete,我在mysql的产品表中有几千个产品 每个产品都有一个存储为整数的制造商[制造商]字段-制造商“id” 随着时间的推移,一些制造商已从“制造商”表中删除,但这些产品已成为孤儿 我是否可以运行一个查询来删除所有孤立的产品 差不多 '删除products.manufacturer不匹配的所有产品 制造商编号' 还有一个复杂问题。一个产品可以有多个制造商,因此该产品。制造商可以有这样的数据“1 | 75 | 432”,其中1、75、432分别是制造商 谢谢你试试这个 DELETE FROM produ

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

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

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

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

差不多

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

还有一个复杂问题。一个产品可以有多个制造商,因此该产品。制造商可以有这样的数据“1 | 75 | 432”,其中1、75、432分别是制造商

谢谢你试试这个

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

您可以与

说明:

你必须先用逗号来替换你的限制器。如果manufacturers表中没有匹配的制造商,则manufacturers表的id列的值将为NULL

请参见语法:

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

从t1中删除t1左连接t1上的t2.id=t2.id,其中t2.id为NULL

有关SELECT语句,请参见


正如我在评论中所说,最好改变数据库设计。一个产品可以有多个制造商,而一个制造商可以生产许多产品,这是A的典型案例。

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

1改变表格设计,制表符限制多个值不是一个好办法 想法,事实上是在一种情况下,你必须加入它的价值

Sol:更改制造商id以仅容纳单个值FK 带有制造商id表

2您需要一些脚本,这些脚本将为不同的应用程序插入多行 选项卡式值

不管怎样,您需要这个来保存剩余的记录

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


现在,您可以根据制造商的要求执行“左键联接”产品,以便高效地执行其他任务。

如果可以,最好更改表的设计。带有字符分隔列表的列在大多数情况下都会产生很多麻烦。如果产品有3家制造商,但其中只有一家被删除了怎么办?你也删除它吗?
DELETE
    p
FROM
    products p
LEFT JOIN
    manufacturer m
ON
    FIND_IN_SET(m.id, REPLACE(p.manufacturer, '|', ','))
WHERE
    m.id IS NULL