Cizí klíče v MySQL
Mám DB, která mj. obsahuje následující tabulky:
CREATE TABLE IF NOT EXISTS `cisvazbatyp` (
`id_vazba_typ` int(11) NOT NULL AUTO_INCREMENT,
`vazba_typ_popis` varchar(255) COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id_vazba_typ`),
UNIQUE KEY `UQ_cisVazbaTyp_id_vazba_typ` (`id_vazba_typ`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=4 ;
INSERT INTO `cisvazbatyp` (`id_vazba_typ`, `vazba_typ_popis`) VALUES
(1, 'spolecnost'),
(2, 'stredisko'),
(3, 'servis');
CREATE TABLE IF NOT EXISTS `tabspolecnost` (
`id_spolecnost` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_user` int(3) unsigned NOT NULL,
`id_spolecnost_typ` int(10) unsigned NOT NULL,
`spolecnost_nazev` varchar(255) COLLATE utf8_czech_ci NOT NULL,
`spolecnost_ic` int(11) NOT NULL,
`spolecnost_platna` enum('A','N') COLLATE utf8_czech_ci NOT NULL DEFAULT 'A',
PRIMARY KEY (`id_spolecnost`),
UNIQUE KEY `UQ_tabSpolecnost_id_spolecnost` (`id_spolecnost`),
KEY `id_user` (`id_user`),
KEY `id_spolecnost_typ2` (`id_spolecnost_typ`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=15 ;
ALTER TABLE `tabspolecnost`
ADD CONSTRAINT `tabspolecnost_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `tabspolecnost_ibfk_2` FOREIGN KEY (`id_spolecnost_typ`) REFERENCES `cisspolecnosttyp` (`id_spolecnost_typ`) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE TABLE IF NOT EXISTS `tabosoba` (
`id_osoba` int(11) NOT NULL AUTO_INCREMENT,
`id_vazba_typ` int(11) NOT NULL,
`id_vazba` int(11) NOT NULL,
`id_osoba_funkce` int(11) NOT NULL,
`osoba_jmeno` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
`osoba_prijmeni` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
PRIMARY KEY (`id_osoba`),
UNIQUE KEY `UQ_tabKontaktniOsoba_id_osoba` (`id_osoba`),
KEY `id_vazba_typ` (`id_vazba_typ`),
KEY `id_vazba` (`id_vazba`),
KEY `id_osoba_funkce` (`id_osoba_funkce`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=4 ;
ALTER TABLE `tabosoba`
ADD CONSTRAINT `tabosoba_ibfk_1` FOREIGN KEY (`id_vazba_typ`) REFERENCES `cisvazbatyp` (`id_vazba_typ`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `tabosoba_ibfk_2` FOREIGN KEY (`id_osoba_funkce`) REFERENCES `cisosobafunkce` (`id_osoba_funkce`) ON DELETE CASCADE ON UPDATE CASCADE;
Kromě těchto tabulek obsahuje i další - např. tabServis, tabStredisko...
Problém:
Když smažu záznam z tabulky tabSpolecnost (tabServis, tabStredisko), tak potřebuju, aby se smazaly automaticky i odpovídající záznamy z tabOsoba. Bohužel záznam v tabOsoba není propojen přímo se záznam v tabSpolecnost, ale je nutno dešifrovat typ vazby pomocí id_vazba_typ, z čehož poznám, jestli ta osoba patří ke společnosti, servisu nebo středisku. Je to možné nějak jednoduše udělat? Myslím bez nutnosti psát triggery, procedury přímo v MySQL apod.
Tenhle návrh struktury není moje dílo, to vymyslela analytička, já osobě bych použila tabulky tabOsoba2Spolecnost, tabOsoba2Stredisko, tabOsoba2servis, pak by se daly foreign klíče nastavit bez problémů a automatické mazání záznamů by taky fungovalo bez problémů.
Bez triggerů nebo procedur těžko.
Možná by to šlo mazat tak, že by sis vše nejdříve načetla, a pak přes metodu get odeslala formulář a podle jednotlivých id.
Avšak MySQL není můj talíř polévky a třeba plácám blbosti. Wikan tomu rozumí rozhodně nejméně 203x víc, než já.
Proč tak komplikovaně? Třeba při testování vytvářím pořád nové společnosti a zas je mažu. A to přímo v phpmyadminovi, protože zobrazení na webu ještě hotové není. A prostě chci, aby když kliknu na ikonku delete v tabulce tabSpolecnost, tak aby se smazalo automaticky vše, co s tím souvisí. Bez nutnosti programovat cokoli dalšího (práce navíc + riziko, že se při případných úpravách na něco zapomene)
To podle mě v phpadminu nejde. Aby to tam šlo, musela by sis vyrobit SQL dotaz a ten tam vložit přes schránku. Pouhým kliknutím na ikonku u jedné tabulky to v phpmyadmin nepůjde, když se to týká několika tabulek. Prima by se ti to všechno dělalo, kdyby ty společnosti měly v tabulkách stejné id, jelikož by pak stačilo mazat stejné id v třeba třech tabulkách a nemuselo by se zjišťovat.
Ono asi PHPADMIN dával jako příklad ne? (edit: nebo ona, myslim, že to byla samčika). Určitě se v tom nebude dělat aplikace. Kliknutím myslela odmazání záznamu a v tom případě to zcela určitě pujde na trigger (kterému by se ráda vyhnula, což chápu, ale nejsem si jistej jestli to mysql bude umět jinak).
jsi z České republiky, ne z Indie. Děláme věci dobře, ne "aby fungovali"
Moc tomu nerozumím, jestli typ_vazby je něco jako číselník se třema hodnotama a to určuje jestli je nějaké id do jedné nebo do druhé tabulky. Tak mi napadaji dve moznosti - virtualni sloupce (počitanej, kde bude ID jen tam, kde je ten správnej TYP a na to se navěsí referenční integrita ON DELETE blabla) a pokud to MYSQL neumí, pak trigger.