4

好的,这(可能)是一个非常简单的问题,但恐怕我对 MySQL 几乎一无所知,所以请多多包涵。我只是想从一个表中删除不受另一个表中的外键约束的每一行 - 一个特定的表,这里只涉及两个表。创建语句看起来有点像:

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;

我的任何 SQL 语句都是:

DELETE FROM job USING job INNER JOIN jobAssignment WHERE job.Job_Id != jobAssignment.JobId;

我认为这是正确的 - 它应该从作业表中删除不存在具有该作业的作业分配的每个作业,因为它是外键。但是,当我尝试执行它时,它会失败并出现以下错误:

无法删除或更新父行:外键约束失败 ( testdatabase. jobassignment, CONSTRAINT FK_jobassignment_1 FOREIGN KEY ( JobId) REFERENCES job ( Job_Id))

那么我做错了什么愚蠢的事情?

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

DELETE FROM job WHERE Job_Id NOT IN (SELECT JobId FROM jobassignment) 

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

4

3 回答 3

7
DELETE FROM job USING job 
LEFT JOIN jobAssignment ON(job.Job_Id = jobAssignment.JobId)
WHERE jobAssignment.JobId IS NULL;
于 2010-07-02T10:24:05.553 回答
5

您可能需要一个子查询,不确定这是否适用于 mySQL,但至少类似:

DELETE FROM job
WHERE job.Job_Id NOT IN (
  SELECT JobId FROM jobAssignment
)
于 2010-07-02T10:24:25.647 回答
1

Naktibalda 建议子查询可能效率低下;如果是这样你可以试试

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

我过去在 IN 和 NOT IN 方面有过不好的经历;NOT EXISTS 的麻烦更少。

于 2010-07-02T10:38:24.580 回答