Хорошо, это (возможно) очень простой вопрос, но я боюсь, что почти не знаю MySQL, поэтому, пожалуйста, мириться со мной. Я просто пытаюсь удалить каждую строку из одной таблицы, которая не ограничена внешним ключом в другой таблице - конкретной таблицей, здесь задействованы только две таблицы. Операторы создания выглядят как: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
) СПИСОК ЛИТЕРАТУРЫjob
(Job_Id
))
Так что глупо я делаю неправильно?
EDIT: Как обычно, я нашел ответ только через несколько секунд после публикации здесь. Я использовал (совершенно другой) запрос:
DELETE FROM job WHERE Job_Id NOT IN (SELECT JobId FROM jobassignment)
Из любопытства, это лучший способ сделать это? Была ли моя оригинальная идея осуществимой? И если да, что с этим случилось?
В вашем заявлении зависимый подзапрос выполняется для каждой строки таблицы заданий, поэтому он очень неэффективен. – Naktibalda
Ваш опубликованный оператор 'DELETE' выглядит немного запутанным, но для ответа на ваше любопытство: для каждой строки в' задании' ваш 'JOIN' производит список строк для каждой строки в' jobassignment', который имеет идентификатор не равный идентификатору задания. Чтобы это было более ясно, превратите инструкцию 'DELETE' в инструкцию' SELECT'. Что-то вроде этого: 'SELECT * FROM job INNER JOIN jobassignment ON job.Job_Id! = Jobassignment.JobId;' – Mike
Спасибо Майку. Я понимаю, что вы сейчас имеете в виду - мое утверждение, поскольку было создано кросс-произведение из двух таблиц, за вычетом строк, где Job_Id == JobId. Попытка удалить это, а затем, конечно, не удалась, потому что она включает в себя задания, которые ограничены. Приветствия. – Stephen