Sql-запрос работает только при наличии всех записей - PullRequest
1 голос
/ 09 февраля 2011
DELETE FROM Profile, Images, Schedules 
 USING Profile 
INNER JOIN Images USING(profile_id) 
INNER JOIN Schedules USING(profile_id) 
     WHERE Profile.profile_id = 47

У меня есть этот фрагмент кода mysql, который удаляет все записи с профилем 47. Однако, скажем, в расписаниях нет 47, тогда весь запрос не удаляет другие записи из других таблиц.

В основном я хочу, чтобы он удалил все, независимо от того, есть ли в расписаниях запись.

Другой вариант - запросить базу данных, чтобы проверить таблицу расписаний перед выполнением запроса на удаление?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Не проще ли сделать:

BEGIN;
DELETE FROM Schedules WHERE Profile_ID = 47;
DELETE FROM Images    WHERE Profile_ID = 47;
DELETE FROM Profile   WHERE Profile_ID = 47;
COMMIT;

И, если необходимо, обернуть это в хранимую процедуру.

0 голосов
/ 09 февраля 2011

Используйте OUTER объединение для доступа к таблицам, которые могут не иметь вспомогательных записей:

DELETE FROM p, i, s
      USING PROFILE p 
  LEFT JOIN IMAGES i ON i.profile_id = p.profile_id
  LEFT JOIN SCHEDULES s ON s.profile_id = p.profile_id
      WHERE p.profile_id = 47

Вот хороший учебник для JOIN .

0 голосов
/ 09 февраля 2011

Вы можете просто переключиться на левое соединение.это удаляет Profile where id=47 + все связанные записи, найденные в изображениях и расписаниях.

DELETE FROM Profile, Images, Schedules 
 USING Profile 
LEFT JOIN Images USING(profile_id) 
LEFT JOIN Schedules USING(profile_id) 
     WHERE Profile.profile_id = 47
...