|
|
|
Удаление из связанных таблиц
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги, прошу помощи в удалении из связанных таблиц. Есть три таблицы: товаров, картинок и таблица связки между ними. Все таблицы типа InnoDB. Когда пользователь пытается удалить товар необходимо удалить и все с ним связанные картинки а так-же связи товар-картинка. Естественно можно это выполнить тремя запросами... но это некрасиво. Хочется сделать один DELETE чтобы он удалит связи, затем товар и картинки ему принадлежащие. Экспериментировал с DELETE весь день... упарился, задачу не решил. Вернее, можно сделать такой вот запрос: Код: sql 1. 2. 3. 4. 5. и он удалит из для первого товара как саму карточку, так и картинки, а так-же связи между ними. Вот только если у товара нет картинок - тогда он ничего не удалит, а хотелось бы карточку товара всё-же удалять. Казалось бы в условии WHERE вместо pi.prod_id следует указать p.prod_id и тогда выборка будет относительно таблицы товаров - но нет, MySQL этого не допускает. Пишет: Код: plaintext 1. Код: sql 1. 2. 3. 4. 5. то MySQL пишет ровно то же самое: Код: plaintext 1. Код: sql 1. 2. 3. 4. 5. результат не оригинален: Код: plaintext 1. В общем, тут я загрустил... и начал уже подумывать - ну её эту крастоту, может таки - хряпнуть на два DELETE Код: sql 1. 2. Но предполагаю, что "прожёные базисты" меня сейчас заклюют. Если у кого есть предположения как выйти из тупика - буду рад. Пробовал Код: plaintext Код: plaintext но например вариация третьего запроса с IGNORE - работает, но странно - удаляет картинки и связки, а карточку товара оставляет. В общем - идеи закончились. Если кому будет интересно, побороться с задачей, вот подробности: Код: plaintext Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2015, 20:36:41 |
|
||
|
Удаление из связанных таблиц
|
|||
|---|---|---|---|
|
#18+
Попробовал с другими таблицами. Вдруг я с CONSTRAINT'ами накосячил... создал таблицу c (категория), таблицу t (товар) и связал их таблицей c_t в товарах есть строчка t_id=7 вне категорий, для t_id=6 напротив - две категории (в остальных по одной) В общем запрос: Код: sql 1. приводит к ответу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Стоит выполнить удаление товара без категорий: Код: sql 1. 2. 3. 4. Последняя строка удаляется: Код: plaintext 1. 2. 3. 4. 5. 6. 7. а вот тот же DELETE ... where t.t_id=6 возвращает ошибку автор23:05:58 delete c_t, c, t from t LEFT JOIN c_t ON (c_t.t_id=t.t_id) LEFT JOIN c ON (c.c_id=c_t.c_id) where t.t_id=6 Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`ozon`.`c_t`, CONSTRAINT `fk_c_has_t_t1` FOREIGN KEY (`t_id`) REFERENCES `t` (`t_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 0.000 sec Код этого примера: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. схема, для визуального представление во вложении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2015, 23:09:27 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39034239&tid=1832793]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 308ms |

| 0 / 0 |
