Mysql 从不在的表中删除行(另一个表)

Mysql 从不在的表中删除行(另一个表),mysql,sql,foreign-keys,sql-delete,Mysql,Sql,Foreign Keys,Sql Delete,我有两个表A和B,在B中有一个A的外键,我要做的是删除A中没有出现在B中的所有行,我执行以下查询,但它不起作用: DELETE from A WHERE id_A not in (select DISTINCT(foreign_key_of_A_in_B) from B) 有什么想法吗?我的第一个建议是尝试不存在,而不是不存在: 如果子查询中的任何值为NULL,NOT IN将返回false或NULL。这就是操作符的定义方式。“不存在”具有更多预期行为。因此,如果子查询中有任何

我有两个表A和B,在B中有一个A的外键,我要做的是删除A中没有出现在B中的所有行,我执行以下查询,但它不起作用:

DELETE from A 
WHERE  id_A
       not in (select DISTINCT(foreign_key_of_A_in_B) from B)

有什么想法吗?

我的第一个建议是尝试不存在,而不是不存在:

如果子查询中的任何值为NULL,NOT IN将返回false或NULL。这就是操作符的定义方式。“不存在”具有更多预期行为。因此,如果子查询中有任何空值,这将起作用,即删除行,但NOT in版本将不起作用

我建议您在执行删除操作之前,使用SELECT尝试以下逻辑:


我的第一个建议是尝试不存在,而不是不存在:

如果子查询中的任何值为NULL,NOT IN将返回false或NULL。这就是操作符的定义方式。“不存在”具有更多预期行为。因此,如果子查询中有任何空值,这将起作用,即删除行,但NOT in版本将不起作用

我建议您在执行删除操作之前,使用SELECT尝试以下逻辑:


从id不在的表中删除的标准如下所示:

DELETE from Table_A 
WHERE  id -- ID of Table_A
       not in (select ID FROM Table_B)
正如您的问题所述,这应该可以从表B中找到不在表A中的ID

首先在SELECT语句中尝试此操作,以查看它是否返回正确的行:

SELECT * from Table_A
WHERE  id -- ID of Table_A
       not in (select ID FROM Table_B)

不要忘记交叉引用某些行以进行双重检查。

从id不在的表中删除的标准如下所示:

DELETE from Table_A 
WHERE  id -- ID of Table_A
       not in (select ID FROM Table_B)
正如您的问题所述,这应该可以从表B中找到不在表A中的ID

首先在SELECT语句中尝试此操作,以查看它是否返回正确的行:

SELECT * from Table_A
WHERE  id -- ID of Table_A
       not in (select ID FROM Table_B)

不要忘记交叉引用某些行以进行双重检查。

尝试从非select中的where id中选择*。。。。有行吗?给我们看看表定义。我想知道fk的定义。请回答Jarlh的问题,以便我们能够帮助您。非常感谢大家的帮助,Gordon的解决方案对我很有效。请尝试从id不在select中的位置选择*。。。。有行吗?给我们看看表定义。我想知道fk的定义。请回答Jarlh的问题,以便我们帮助您。感谢很多人的帮助,Gordon的解决方案对我有效。非常感谢Gordon的解决方案和解释不知道这种带有空值的行为以前不存在,它像一个符咒一样工作!非常感谢Gordon提供的解决方案,解释人员不知道这种带有空值的行为以前是不存在的,它工作起来很有魅力!这就是我所做的,但在这种情况下,使用Gordon解释的不存在是最好的方法。这就是我所做的,但在这种情况下,使用Gordon解释的不存在是最好的方法。