Ste*_*hen 4 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 (`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;
Run Code Online (Sandbox Code Playgroud)
我的任何SQL语句都是:
DELETE FROM job USING job INNER JOIN jobAssignment WHERE job.Job_Id != jobAssignment.JobId;
Run Code Online (Sandbox Code Playgroud)
我认为这是正确的 - 它应该删除作业表中的每个作业,而作业作业中没有作业,因为它是外键.但是,当我尝试执行它时失败并出现以下错误:
无法删除或更新父行:外键约束失败(
testdatabase.jobassignment,CONSTRAINTFK_jobassignment_1FOREIGN KEY(JobId)REFERENCESjob(Job_Id))
那么我做错了什么傻事呢?
编辑:像往常一样,我在帖子发布后几秒钟就找到了答案.我使用(完全不同的)查询:
DELETE FROM job WHERE Job_Id NOT IN (SELECT JobId FROM jobassignment)
Run Code Online (Sandbox Code Playgroud)
出于好奇,这是更好的方法吗?我最初的想法是否可行?如果是这样,它有什么问题?
DELETE FROM job USING job
LEFT JOIN jobAssignment ON(job.Job_Id = jobAssignment.JobId)
WHERE jobAssignment.JobId IS NULL;
Run Code Online (Sandbox Code Playgroud)
您可能需要一个子查询,不确定这是否适用于mySQL,但至少类似于:
DELETE FROM job
WHERE job.Job_Id NOT IN (
SELECT JobId FROM jobAssignment
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2499 次 |
| 最近记录: |