Autor Zpráva
Ondřej Ryška
Profil
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 ;
A to isté aj v tej druhej tb.

EDIT:
Stačí index na rodičovskú tabuľku.
Kajman
Profil
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
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
$mysqli_instance->insert_id;
případně
mysql_insert_id()
Ondřej Ryška
Profil
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
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
Na verzi 5.5 to doplní defaultní
... ON DELETE RESTRICT ON UPDATE RESTRICT
a funguje to, jak chcete.

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
Čože, vám to nevyhadzuje error 150?
Ondřej Ryška
Profil
Aha takže můj problém bude asi způsoben starší verzí MySql..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0