sql >> Databáze >  >> RDS >> Mysql

Pořadí mazání s omezeními cizího klíče,

Oficiálně nemáte žádnou kontrolu nad pořadím kaskádových operací. Možná budete moci zneužít některé nedokumentované chování však:

  • u MySQL 5.5 se cizí klíče spouštějí v pořadí, v jakém byly vytvořeny, takže vypuštění a opětovné vytvoření fk_category_org -omezení by mělo fungovat
  • pro MySQL 5.6+ se cizí klíče spouštějí v lexikálním pořadí jejich jmen, takže přejmenování fk_category_org k např. fk_z_category_org by měl fungovat

Toto není zdokumentováno a může se kdykoli změnit (a může být ovlivněno jinými faktory).

Jak již bylo řečeno, správný způsob, jak to udělat (a cokoli jiného příliš komplikovaného pro on cascade ) by bylo přidat before delete -spouštěč ve vaší organisation -tabulka, která "ručně" nejprve odstraní uživatele a poté kategorie. before delete -triggery se spouštějí před on cascade (takže se můžete rozhodnout, zda si je chcete ponechat nebo ne, i když by to pravděpodobně bylo zavádějící).

Není zcela jasné, zda je to vaše zamýšlené chování, ale v současné době může mít uživatel kategorii, která patří do organizace 1, zatímco je přiřazen k organizaci 2. Smazání organizace 1 by pak stále selhalo. Trochu to vypadá, že právě tomu chcete svým návrhem zabránit, ale pokud chcete, aby mazání fungovalo i v tomto případě, potřebujete chcete-li použít spouštěč k tomu, abyste jej mohli začlenit (nebo jej ručně odstranit ve vaší aplikaci), kaskádování nebude fungovat, pokud nezařadíte také tabulku kategorií.




  1. JSON_QUOTE() – Jak uniknout ze znaků v řetězcích používaných jako hodnoty JSON v MySQL

  2. Vyberte Více řádků v jednom sloupci oddělených Novým řádkem

  3. První pohled na nový odhad kardinality serveru SQL Server

  4. Jak najít umístění databáze MySQL na pevném disku?