好的,这(可能)是一个非常简单的问题,但恐怕我对 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
, CONSTRAINTFK_jobassignment_1
FOREIGN KEY (JobId
) REFERENCESjob
(Job_Id
))
那么我做错了什么愚蠢的事情?
编辑:像往常一样,我在这里发布后仅几秒钟就找到了答案。我使用了(完全不同的)查询:
DELETE FROM job WHERE Job_Id NOT IN (SELECT JobId FROM jobassignment)
出于好奇,这是更好的方法吗?我最初的想法是否可行?如果是这样,它有什么问题?