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

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

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
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
Věrný člen
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
Věrný člen
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
Věrný člen
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
Věrný člen
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
899 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+14
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+14
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+14
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
Věrný člen
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, 5 hostů

 

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