ON DELETE CASCADE
е начин за изтриване на ред, когато се изтрие ред, който препраща. Това означава:
- Имате ред в таблица А
- Имате ред в таблица Б, който препраща към ред в таблица А
- Изтривате реда в таблица A
- Базата данни изтрива съответния ред в таблица B
Така че имате артикули и всеки артикул принадлежи към определена категория. Във вашата таблица с артикули имате category_id (и моля, коригирайте правописа), който се отнася до ред в таблицата с категории. И така, във вашата ситуация:
- Имате категория
- Имате елемент, който препраща към категория
- Изтривате категория
- Базата данни изтрива всички елементи, които отговарят на тази категория
Това, което искате, е обратното:
- Имате артикули
- Изтривате последния елемент в определена категория
- База данни отива, намира тази категория и я изтрива
Няма начин да направите това с ON DELETE CASCADE
, поради две причини:
- Как ще създадете празна категория, преди да вмъкнете първия си елемент в нея? Базата данни ще трябва да я изтрие незабавно.
- Базата данни ще трябва да свърши много допълнителна работа, сканирайки таблицата. Не "знае", че артикул #23082 е последният артикул в категорията; ще трябва по някакъв начин да следи броя на елементите в категорията, за да направи това.
Всичко това произтича от факта, че ON DELETE CASCADE
е начин за поддържане на референтната цялост . Тоест, това е начин базата данни да ви даде силна гаранция, че ако видите категория #20393 на артикул #9847, когато отидете да потърсите категория #20393 знаете, че съществува . Това ене устройство за спестяване на труд. :) Ето защо другите опции са ON DELETE SET NULL
и ON DELETE RESTRICT
:те също гарантират целостта, но вместо да изтриват, премахват лошата препратка или предотвратяват извършването на оригиналното изтриване.
Така че отговорът е, че ще трябва или да напишете задача на cron, за да почиствате периодично тази таблица, или да използвате някакъв вид тригер ON DELETE, ако се притеснявате за празни категории.