Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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ů.

Předmět Autor Datum
Bez triggerů nebo procedur těžko.
Wikan 29.05.2013 10:25
Wikan
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…
Kráťa 29.05.2013 10:52
Kráťa
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…
Anicka 29.05.2013 11:06
Anicka
To podle mě v phpadminu nejde. Aby to tam šlo, musela by sis vyrobit SQL dotaz a ten tam vložit přes…
Kráťa 29.05.2013 11:50
Kráťa
Ono asi PHPADMIN dával jako příklad ne? (edit: nebo ona, myslim, že to byla samčika). Určitě se v to… poslední
AZOR 29.05.2013 11:55
AZOR
Moc tomu nerozumím, jestli typ_vazby je něco jako číselník se třema hodnotama a to určuje jestli je…
AZOR 29.05.2013 11:16
AZOR

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).

:-D 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.

Zpět do poradny Odpovědět na původní otázku Nahoru