Proč nemohu smazat řádek v tabulce – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Proč nemohu smazat řádek v tabulce – MySQL – Fórum – Programujte.comProč nemohu smazat řádek v tabulce – MySQL – Fórum – Programujte.com

 

jAkErCZ0
Stálý člen
6. 9. 2018   #1
-
0
-

Hele, mám tabulku order ve které mám návaznost na tabulku order_detail a v této tabulce může na jednu zakázku být více produktů... ale jakmile chci nějaký produkt smazat tak mi začne řvát

Cannot delete or update a parent row: a foreign key constraint fails (`intranet`.`order`, CONSTRAINT `order_ibfk_24` FOREIGN KEY (`detail_id`) REFERENCES `order_detail` (`order_id`))

Vím že se to týká klíče ale já ten klíč mám nastavený na RESTRICT tudíž by to nemělo mít vliv ne?

Jak tedy docílit toho že když smažu něco v tabulce detail_order tak nebude problém s klíčem...

 

Nahlásit jako SPAM
IP: 109.183.230.–
6. 9. 2018   #2
-
0
-

Foreign = cizí a parent = rodič. Zřejmě existují "child" záznamy v ostatních tabulkách. Chtělo by to vědět více o uspořádání tvé databáze, zejména o vazbách mezi tabulkami.

Zkus do Google napsat mysql foreign key delete parent, myslím že ti najde řešení.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jAkErCZ0
Stálý člen
6. 9. 2018   #3
-
0
-

#2 hlucheucho 

Chci že při odstranění řádku v order_detail mi zůstal ten řádek v order

DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `state` enum('NOVÁ','PODEPSÁNO','UHRAZENÁ ZÁLOHA','VE VÝROBĚ','SKLAD','HOTOVO','PŘED DOKONČENÍM','STORNO','REKLAMACE') COLLATE utf8_czech_ci NOT NULL,
  `date` datetime NOT NULL,
  `number` int(11) NOT NULL,
  `serial_number` varchar(155) COLLATE utf8_czech_ci NOT NULL,
  `type` varchar(155) COLLATE utf8_czech_ci NOT NULL,
  `commodity` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `construction_date` datetime DEFAULT NULL,
  `construction_team` int(11) NOT NULL,
  `state_date` datetime DEFAULT NULL,
  `weight` int(100) DEFAULT NULL,
  `detail_id` int(11) NOT NULL,
  `invoices_id` int(11) NOT NULL,
  `client_id` int(11) NOT NULL,
  `dealer_id` int(11) NOT NULL,
  `source_id` int(11) NOT NULL,
  `price` float NOT NULL,
  PRIMARY KEY (`order_id`),
  KEY `client` (`client_id`),
  KEY `dealer` (`dealer_id`),
  KEY `source` (`source_id`),
  KEY `detail` (`detail_id`),
  KEY `construction_team` (`construction_team`),
  KEY `invoices` (`invoices_id`),
  CONSTRAINT `order_ibfk_14` FOREIGN KEY (`client_id`) REFERENCES `client` (`client_id`),
  CONSTRAINT `order_ibfk_15` FOREIGN KEY (`dealer_id`) REFERENCES `dealer` (`dealer_id`),
  CONSTRAINT `order_ibfk_16` FOREIGN KEY (`source_id`) REFERENCES `source` (`source_id`),
  CONSTRAINT `order_ibfk_17` FOREIGN KEY (`construction_team`) REFERENCES `construction_team` (`construction_team_id`),
  CONSTRAINT `order_ibfk_27` FOREIGN KEY (`detail_id`) REFERENCES `order_detail` (`order_id`),
  CONSTRAINT `order_ibfk_6` FOREIGN KEY (`invoices_id`) REFERENCES `order_invoices` (`invoices_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


DROP TABLE IF EXISTS `order_detail`;
CREATE TABLE `order_detail` (
  `order_detail_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `supplier` enum('petecki','kns','witraz','alsecco','pagen','int_dvere','kasko_z','kasko_s','paramont','vrata','rolety','vyplne','purenit','ostatni') COLLATE utf8_czech_ci NOT NULL,
  `price` float DEFAULT NULL,
  PRIMARY KEY (`order_detail_id`),
  KEY `order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

Tady je struktura :)

Nahlásit jako SPAM
IP: 109.183.230.–
MilanL+1
Grafoman
6. 9. 2018   #4
-
0
-

#3 jAkErCZ

čau, řekl bych, že tam máš obousměrnou vazbu nebo vazbu 1:1, zkus nejdřív v Order vynulovat/nastavit jiný daný detail_id a pak teprve smazat v order_detail.

Nahlásit jako SPAM
IP: 91.139.9.–
jAkErCZ0
Stálý člen
6. 9. 2018   #5
-
0
-

#4 MilanL
Jenže já potřebuji vazbu 1:N že jedna order muže mít několik order_detail.

Nahlásit jako SPAM
IP: 109.183.230.–
MilanL+1
Grafoman
6. 9. 2018   #6
-
0
-

#6 MilanL
každopádně při 1:N tam ta zpětná vazba tj detail:id do Order nepatří

a ten foreign klíč má být u detailu, takhle jak to máš ti to právě ten detail blokuje, takže  

DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `state` enum('NOVÁ','PODEPSÁNO','UHRAZENÁ ZÁLOHA','VE VÝROBĚ','SKLAD','HOTOVO','PŘED DOKONČENÍM','STORNO','REKLAMACE') COLLATE utf8_czech_ci NOT NULL,
  `date` datetime NOT NULL,
  `number` int(11) NOT NULL,
  `serial_number` varchar(155) COLLATE utf8_czech_ci NOT NULL,
  `type` varchar(155) COLLATE utf8_czech_ci NOT NULL,
  `commodity` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `construction_date` datetime DEFAULT NULL,
  `construction_team` int(11) NOT NULL,
  `state_date` datetime DEFAULT NULL,
  `weight` int(100) DEFAULT NULL,
  `invoices_id` int(11) NOT NULL,
  `client_id` int(11) NOT NULL,
  `dealer_id` int(11) NOT NULL,
  `source_id` int(11) NOT NULL,
  `price` float NOT NULL,
  PRIMARY KEY (`order_id`),
  KEY `client` (`client_id`),
  KEY `dealer` (`dealer_id`),
  KEY `source` (`source_id`),
  KEY `construction_team` (`construction_team`),
  KEY `invoices` (`invoices_id`),
  CONSTRAINT `order_ibfk_14` FOREIGN KEY (`client_id`) REFERENCES `client` (`client_id`),
  CONSTRAINT `order_ibfk_15` FOREIGN KEY (`dealer_id`) REFERENCES `dealer` (`dealer_id`),
  CONSTRAINT `order_ibfk_16` FOREIGN KEY (`source_id`) REFERENCES `source` (`source_id`),
  CONSTRAINT `order_ibfk_17` FOREIGN KEY (`construction_team`) REFERENCES `construction_team` (`construction_team_id`),
  CONSTRAINT `order_ibfk_6` FOREIGN KEY (`invoices_id`) REFERENCES `order_invoices` (`invoices_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


DROP TABLE IF EXISTS `order_detail`;
CREATE TABLE `order_detail` (
  `order_detail_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `supplier` enum('petecki','kns','witraz','alsecco','pagen','int_dvere','kasko_z','kasko_s','paramont','vrata','rolety','vyplne','purenit','ostatni') COLLATE utf8_czech_ci NOT NULL,
  `price` float DEFAULT NULL,
  PRIMARY KEY (`order_detail_id`),
  KEY `order_id` (`order_id`),
  CONSTRAINT `order_ibfk_27` FOREIGN KEY (`order_id`) REFERENCES `order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
6. 9. 2018   #7
-
0
-

#6 MilanL
v order_detail u toho foreing klíče by mělo bejt ještě  RESTRICT - order nepůjde smazat pokud v order_detail bude nějaká položka s order_id

dej si pozor na tu CASCADU - v některých případech ti může způsobit, že smažeš order a s ním i vše ostatní, podle účelu DB nebo konkrétních tabulek to někdy může být být žádoucí jindy ne.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
6. 9. 2018   #8
-
+2
-
Zajímavé

#7 MilanL
obecně bych řekl, že je to blbě řešené, kdysi v obchodní DB v MS accessu jsem dělal kompletní objednávkový systém, Objednávka by měla bejt objednávka a ne průběh zakázky v tomhle případě by to měla být pouze vazební tabulka pro propojení s ostatními.

Objednávka .- v podstatě jen základní údaje (číslo, číslo obj odběratele, id odběratele. Datumy a termíny, STATUS + další věci, např jiná dodací adresa, kontakt, poznámka apod, ), vše ostatní v podřízených tabulkách

pak můžeš třeba tabulku položek, kde může být prodej hotových výrobků, služeb , sestav (sady výrobků, výrobek se službou např montáží), zakázkových výrobků apod

a další věci v návaznosti, model DB je třeba hodně dobře dopředu promyslet.

Nahlásit jako SPAM
IP: 185.112.167.–
gna
~ Anonymní uživatel
1891 příspěvků
6. 9. 2018   #9
-
-1
-
Mimo téma

#5 jAkErCZ
Správně. A když smažeš detail, tak chceš smazat i tu rodičovskou objednávku, nebo v ní nechat neplatný odkaz? Asi ani jedno, že? Zapni mozek, nebo ber jen kšefty, na které máš.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
6. 9. 2018   #10
-
0
-

#8 MilanL
Není od věci, pokud jiná dodací adresa, kontakt, poznámka apod. jsou také v podřízených tabulkách.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:e93f:3e49:f346:9c3c...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
6. 9. 2018   #11
-
0
-

#3 jAkErCZ
Tou strukturou databáze se ti někdo chtěl pomstít nebo sis ji takhle navrhl sám?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:e93f:3e49:f346:9c3c...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
6. 9. 2018   #12
-
+1
-
Zajímavé

#3 jAkErCZ
Odstraň všechny řádky obsahující detail_id. Ten constraint patří do tabulky order_detail.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:e93f:3e49:f346:9c3c...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Stálý člen
7. 9. 2018   #13
-
0
-

Vyzkouším vaše rady, a jen mezi námi to není e-shop systém ale úplně něco jiného :) 
 

Nahlásit jako SPAM
IP: 109.183.230.–
MilanL+1
Grafoman
7. 9. 2018   #14
-
+1
-
Zajímavé

#13 jAkErCZ
to je jedno, každopádně, když jsem dělal ten objednávkový systém v MS Accessu tak byl internet ještě v plenkách psal se rok 1993-4, malo/velkoobchod elektrickým a ručním nářadím stroji, příslušenstvím a materiály, + zakázky na Záruční a pozáruční opravy.

Vše se dá řešit jen je třeba mít dostatečně podrobné podklady a podle nich na definovanej model DB, šikovně nadefinovaná DB může pak ušetřit dost práce na vlastním programu, případné pozdější změny v modelu, můžou být problematické, někdy zakomponování i drobné změny v DB může přidělat víc práce, než to původní naprogramování.

Nahlásit jako SPAM
IP: 91.139.9.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý