2016-03-22 2 views
0

Я сделал скрипку здесь: http://sqlfiddle.com/#!9/a67558/1Как вручную найти и удалить осиротевшие записи - две таблицы?

Из-за внешние ограничения, идентификаторы (EID и DID) не были указаны с ПК. Я чувствую, что я близко, но SQL бросает синтаксические ошибки, проблема может быть в программе?

Цель состоит в том, чтобы удалить строку, где EID = 100 из таблицыJoin после удаления записи из таблицы сотрудников с помощью триггера.

Редактировать на комментарий Эндрю:

Я пробовал:

CREATE TRIGGER DeOrphan 
AFTER DELETE ON employee 
FOR EACH ROW DELETE FROM joinTable.* FROM employee 
RIGHT JOIN tableJoin ON employee.eid=tableJoin.eid 
WHERE employee.eid IS NULL; 

DELETE FROM employee 
WHERE employee.eid = 100; 

Запись успешно удалена из таблицы сотрудников, но сохраняется в tableJoin.

+0

Вы должны показать код на свой вопрос, а не использовать внешний сайт , –

ответ

1

Попробуйте

DELETE FROM joinTable WHERE EID NOT IN (SELECT eid FROM employee) 

Это будет отдельный вызов и будет убирать все сироты, но если вы вызываете его на регулярной основе он должен быть довольно быстрый процесс.

+0

Это то, что я думал, что ОП спрашивает, и я собирался написать что-то подобное. – goodguy5

1

Там нет необходимости в NOT IN/NOT EXISTS, в триггере вы получили доступ к удаленной строке:

CREATE TRIGGER DeOrphan 
AFTER DELETE ON employee 
FOR EACH ROW 
DELETE FROM joinTable WHERE `eid` = old.`eid`; 

См fiddle

+0

Это работает на скрипке, однако я получаю синтаксическую ошибку в Postggresql. «PostgreSQL сказал: синтаксическая ошибка на уровне« DELETE »или рядом с ним. Пробовал без 'on eid, но проблема остается –

+0

@RobertTan: Почему вы создаете скрипт' mysql', когда вам нужен синтаксис PG? Похоже, что в PG вам нужно обернуть модифицирующую логику в Function/Procedure, а затем «EXECUTE»: http://www.postgresql.org/docs/9.5/static/sql-createtrigger.html – dnoeth

+0

У меня возникли проблемы с установкой MySQL и использовал PG в качестве прокси, я извиняюсь за неприятности –

Смежные вопросы