MySQL正在尝试删除所有不受外键约束的行

MySQL正在尝试删除所有不受外键约束的行,mysql,foreign-keys,sql-delete,Mysql,Foreign Keys,Sql Delete,好的,这(可能)是一个非常简单的问题,但我恐怕我几乎不知道MySQL,所以请容忍我。我只是试图删除一个表中的每一行,而这不受另一个表中外键的约束—一个特定的表,这里只涉及两个表。create语句看起来有点像: CREATE TABLE `testschema`.`job` ( `Job_Id` int(10) unsigned NOT NULL AUTO_INCREMENT, `Comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`Jo

好的,这(可能)是一个非常简单的问题,但我恐怕我几乎不知道MySQL,所以请容忍我。我只是试图删除一个表中的每一行,而这不受另一个表中外键的约束—一个特定的表,这里只涉及两个表。create语句看起来有点像:

CREATE TABLE  `testschema`.`job` (
  `Job_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Comment` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Job_Id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE  `ermieimporttest`.`jobassignment` (
  `JobAssignment_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `JobId` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`JobAssignment_Id`),
  KEY `FK_jobassignment_1` (`JobId`),
  CONSTRAINT `FK_jobassignment_1` FOREIGN KEY (`JobId`) REFERENCES `job` (`Job_Id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
任何my SQL语句都是:

DELETE FROM job USING job INNER JOIN jobAssignment WHERE job.Job_Id != jobAssignment.JobId;
我认为这是正确的-它应该从job表中删除不存在将该job作为外键的job assignment的每个job。但是,当我尝试执行它时,它失败了,并出现以下错误:

无法删除或更新父行: 外键约束失败 (
testdatabase
jobsignment
, 约束
FK\u作业分配\u 1
外键(
JobId
)引用
job
作业Id
))

那么我做错了什么蠢事

编辑:和往常一样,我在这里发布后几秒钟就找到了答案。我使用了(完全不同的)查询:


出于好奇,这是更好的方法吗?我最初的想法可行吗?如果是这样的话,那又有什么问题呢

您可能需要一个子查询,不确定它在mySQL中是否有效,但至少类似于:

DELETE FROM job USING job 
LEFT JOIN jobAssignment ON(job.Job_Id = jobAssignment.JobId)
WHERE jobAssignment.JobId IS NULL;
DELETE FROM job
WHERE job.Job_Id NOT IN (
  SELECT JobId FROM jobAssignment
)

Naktibalda认为子查询可能效率低下;如果是这样,你可以试试

DELETE FROM job
     WHERE NOT EXISTS (SELECT *
                           FROM jobassignment
                           WHERE job.Job_Id = jobassignment.Job_Id);

在过去,我曾经有过不好的经历;不存在这样的问题。

在您的语句中,对作业表中的每一行执行依赖于语句的子查询,因此效率非常低。您发布的
DELETE
语句似乎有点混乱,但为了回答您的好奇:对于
作业中的每一行
,您的
JOIN
正在为
jobsignment
中id不等于作业id的每一行生成一个行列表。要更清楚地看到这一点,请将
DELETE
语句转换为
SELECT
语句。类似于以下内容:
SELECT*FROM job internal job job job\u Id!=jobsignment.JobIdDELETE FROM job
     WHERE NOT EXISTS (SELECT *
                           FROM jobassignment
                           WHERE job.Job_Id = jobassignment.Job_Id);