Autor | Zpráva | ||
---|---|---|---|
Ondřej Ryška Profil |
#1 · Zasláno: 23. 3. 2013, 14:07:32 · Upravil/a: Moderátor (editace znemožněna) 23. 3. 2013, 19:31:21
Zdravím,
mám tyto dvě tabulky: CREATE TABLE `OZNAMENIOBJ` ( `ID_OZNAMENIOBJ` int(5) NOT NULL auto_increment, `JMPRN_JMPRZ` varchar(60) collate utf8_czech_ci NOT NULL, `KOD` varchar(5) collate utf8_czech_ci NOT NULL, `POCET` int(4) NOT NULL, `CENA_KUS` int(4) NOT NULL, `JM_PR_N` varchar(30) collate utf8_czech_ci NOT NULL, `JM_PR_Z` varchar(30) collate utf8_czech_ci NOT NULL, `DATUM` date default NULL, `CAS` time default NULL, `MISTO` varchar(30) collate utf8_czech_ci default NULL, `DOPL_TEXT` varchar(300) collate utf8_czech_ci default NULL, `OBALKY` binary(1) NOT NULL, `CITAT` varchar(150) collate utf8_czech_ci default NULL, `BARVA` varchar(8) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`ID_OZNAMENIOBJ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1; CREATE TABLE `KARTICKYSTULOBJ` ( `ID_KARTICKYSTULOBJ` int(5) NOT NULL auto_increment, `JMPRN_JMPRZ` varchar(60) collate utf8_czech_ci NOT NULL, `KOD` varchar(5) collate utf8_czech_ci NOT NULL, `CENA_KUS` int(4) NOT NULL, `POCET` int(4) NOT NULL, `JMENA_HOSTU` varchar(1000) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`ID_KARTICKYSTULOBJ`), KEY `fk_KARTICKYSTULOBJ_OZNAMENIOBJ` (`JMPRN_JMPRZ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ; Potřeboval bych zajistit, aby nebylo možno smazat záznam z tabulky OZNAMENIOBJ je-li v té druhé závislé tabulce závislý záznam. Zkoušel jsem něco jako: ALTER TABLE `KARTICKYSTULOBJ` ADD CONSTRAINT `fk_KARTICKYSTULOBJ_OZNAMENIOBJ` FOREIGN KEY (`JMPRN_JMPRZ`) REFERENCES `OZNAMENIOBJ` (`JMPRN_JMPRZ`) ale asi jdu na to špatně. Díky Moderátor Kajman: Vkládej prosím kódy mezi značky [>pre] a [>/pre] (stačí kliknout na ).
|
||
Camo Profil |
Musíš na tie závislé stĺpce pridať indexy.
CREATE TABLE `KARTICKYSTULOBJ` ( `ID_KARTICKYSTULOBJ` int(5) NOT NULL auto_increment, `JMPRN_JMPRZ` varchar(60) collate utf8_czech_ci NOT NULL, `KOD` varchar(5) collate utf8_czech_ci NOT NULL, `CENA_KUS` int(4) NOT NULL, `POCET` int(4) NOT NULL, `JMENA_HOSTU` varchar(1000) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`ID_KARTICKYSTULOBJ`), INDEX Kart_ind (JMPRN_JMPRZ), KEY `fk_KARTICKYSTULOBJ_OZNAMENIOBJ` (`JMPRN_JMPRZ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ; EDIT: Stačí index na rodičovskú tabuľku. |
||
Kajman Profil |
#3 · Zasláno: 23. 3. 2013, 18:38:02
Ondřej Ryška:
V druhé tabulce použijte k provázání místo JMPRN_JMPRZ sloupec ID_OZNAMENIOBJ, který je primárním klíčem v první tabulce a půjde tedy udělat i ten cizí klíč zabraňující mazání. |
||
Ondřej Ryška Profil |
#4 · Zasláno: 23. 3. 2013, 19:17:01
Kajman:
Takhle jsem to původně chtěl udělat. Ale mám v tom trochu zmatek. Dejme tomu že to tak tedy udělám. Ukládání do tabulek bude probíhat najednou v jednom php skriptu. První se uloží logicky OZNAMENIOBJ, potom závislá tabulka KARTICKYSTULOBJ. První tabulka, OZNAMENIOBJ, se normálně uloží s vygenerovaným primárním klíčem pomocí autoinkrementu. Data do druhé tabulky se budou někdy ukládat, někdy ne (podle toho jak uživatel vyplní formulář). Tedy pokud nastane situace, že se bude i do druhé tabulky ukládat, potřebuji jí zadat hodnotu cizího klíče. Tím bude právě ta hodnota primárního klíče vygenerovaná pomocí autoinkrementu v tabulce OZNAMENIOBJ. Ale jak já v tom php skriptu zjistím, jaká hodnota to byla? Možná hloupý dotaz.... |
||
Kajman Profil |
#5 · Zasláno: 23. 3. 2013, 19:21:30
$mysqli_instance->insert_id; mysql_insert_id() |
||
Ondřej Ryška Profil |
#6 · Zasláno: 23. 3. 2013, 19:31:44
Super. Takovou nějakou funkci jsem přesně potřeboval. Předělám to teda tak, že provázání tabulek bude přes ID_OZNAMENIOBJ. Díky moc.
|
||
Ondřej Ryška Profil |
#7 · Zasláno: 23. 3. 2013, 21:42:38
Tak nevím teda. Takhle vytvářím tabulky a omezení:
CREATE TABLE `OZNAMENIOBJ` ( `ID_OZNAMENIOBJ` int(5) NOT NULL auto_increment, `KOD` varchar(5) collate utf8_czech_ci NOT NULL, `POCET` int(4) NOT NULL, `CENA_KUS` int(4) NOT NULL, `JM_PR_N` varchar(30) collate utf8_czech_ci NOT NULL, `JM_PR_Z` varchar(30) collate utf8_czech_ci NOT NULL, `DATUM` date default NULL, `CAS` time default NULL, `MISTO` varchar(30) collate utf8_czech_ci default NULL, `DOPL_TEXT` varchar(300) collate utf8_czech_ci default NULL, `OBALKY` binary(1) NOT NULL, `CITAT` varchar(150) collate utf8_czech_ci default NULL, `BARVA` varchar(8) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`ID_OZNAMENIOBJ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1; CREATE TABLE `KARTICKYSTULOBJ` ( `ID_KARTICKYSTULOBJ` int(5) NOT NULL auto_increment, `ID_OZNAMENIOBJ` int(5) NOT NULL, `KOD` varchar(5) collate utf8_czech_ci NOT NULL, `CENA_KUS` int(4) NOT NULL, `POCET` int(4) NOT NULL, `JMENA_HOSTU` varchar(1000) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`ID_KARTICKYSTULOBJ`), KEY `fk_KARTICKYSTULOBJ_OZNAMENIOBJ` (`ID_OZNAMENIOBJ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1; ALTER TABLE `KARTICKYSTULOBJ` ADD CONSTRAINT `fk_KARTICKYSTULOBJ_OZNAMENIOBJ` FOREIGN KEY (`ID_OZNAMENIOBJ`) REFERENCES `OZNAMENIOBJ` (`ID_OZNAMENIOBJ`) Používám phpMyAdmin 2.6.0-pl3 a MySQL 5.0.67 Skript v pohodě projde. Pak pomocí gui v phpmyadminu vložím do první tabulky záznam, potom vložím do druhé záznam se stejnou hodnotou ID_OZNAMENI aby byly závislé. No a potom chci z první tabulky ten záznam vymazat a čekám že na mě zařve error, ale záznam se v klidu smaže. A to sem si myslel že nepůjde, protože je na to záznamu závislý ten z druhé tabulky.Zkoušel sem do obou tabulek přidat i ty indexy na ID_OZNAMENIOBJ, ale zas nic. Mám tam ještě něco špatně, nemusí být třeba ještě něco na konci toho omezení, takové to ON ACTION, ON CASCADE apod. ? |
||
Kajman Profil |
#8 · Zasláno: 23. 3. 2013, 22:59:55
Na verzi 5.5 to doplní defaultní
... ON DELETE RESTRICT ON UPDATE RESTRICT Cannot delete or update a parent row: a foreign key constraint fails (`KARTICKYSTULOBJ`, CONSTRAINT `KARTICKYSTULOBJ_ibfk_1` FOREIGN KEY (`ID_OZNAMENIOBJ`) REFERENCES `OZNAMENIOBJ` (`ID_OZNAMENIOBJ`)) |
||
Camo Profil |
#9 · Zasláno: 24. 3. 2013, 08:12:21
Čože, vám to nevyhadzuje error 150?
|
||
Ondřej Ryška Profil |
#10 · Zasláno: 24. 3. 2013, 09:19:35
Aha takže můj problém bude asi způsoben starší verzí MySql..
|
||
Časová prodleva: 11 let
|
0