Problém s ON DELETE – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s ON DELETE – MySQL – Fórum – Programujte.comProblém s ON DELETE – MySQL – Fórum – Programujte.com

 

Taiwan
~ Anonymní uživatel
10 příspěvků
25. 3. 2014   #1
-
0
-

Dobrý den, mám takový problém s foreign klíčema. Mám několik tabulek, které jsou vzájemně provázány a problém je v tom, že když v jedné z těch tabulek, mám více řádků odkazující na jeden řádek v mateřské tabulce. Tak se při smazání řádku v mateřské tabulce nesmažou všechny řádky na něj odkazující. Když je v dceřinné pouze jeden řádek, tak se smaže. Pokud je jich tam více, kteří odkazují na stejný řádek, tak se smaže vždy ten poslední, někdy i předchozí a vždy zůstane ten první. I přes to, že už nemá na co odkazovat. Ovšem pokud řádek v mateřské tabulce smažu přímo z phpmyadmin tak se smažou i všechny odkazující řádky. Divné co? Tak teď babo raď :) Kde je problém? Děkuji za připadné odpovědi.

Nahlásit jako SPAM
IP: 88.146.225.–
Kit+15
Guru
25. 3. 2014   #2
-
0
-

#1 Taiwan
Pokud to dělá MyISAM, tak se ani nedivím. Zkus InnoDB.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Taiwan
~ Anonymní uživatel
10 příspěvků
26. 3. 2014   #3
-
0
-

Právě, že používám InnoDB. Dělá to jen u tabulky která bere z jiné dceřinné. Pro ukázku struktura je zhruba taková:

Připojen obrázek.

Všude je ON DELETE - CASCADE

A když v table1 smažu záznam a v table5 je více radku odkazujicich na table4, tak mi tam vždycky nějakej zůstane. Jak jsem již psal výše.

Nahlásit jako SPAM
IP: 88.146.225.–
KIIV
~ Moderátor
+43
God of flame
26. 3. 2014   #4
-
0
-

#3 Taiwan
nemas z toho i nejakej export? pokud to co tvrdis je pravda, tak se tam porusuje zachovani referencni integrity a je to pak vlastne nepouzitelna databaze...

(ikdyz je vetsinou pravdepodobnejsi nejaka chyba v navrhu)

napriklad mi neni jasne, proc tam jsou napriklad table4_table2_table1_idtable a podobny .. vzdy staci jen vedet nadrazeny id, k ostatnim se da dostat

treba to pak nejak blokuje to mazani

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
26. 3. 2014   #5
-
0
-

#3 Taiwan
V table5 je položka s názvem table4_table3_idtable3. Horší název jsi už vymyslet asi nemohl. Proč se nejmenuje table3_id, když nemá vazbu na table4, ale na table3? To vidím jako chybu v návrhu. Také názvy tabulek jsou úplně debilní.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Taiwan
~ Anonymní uživatel
10 příspěvků
26. 3. 2014   #6
-
0
-

Tak ještě oprava, maže si to jak chce. Někdy to smaže dva, někdy jeden. A přes phpmyadmina to maže taky blbě, jako přes query...

Nahlásit jako SPAM
IP: 88.146.225.–
Taiwan
~ Anonymní uživatel
10 příspěvků
26. 3. 2014   #7
-
0
-

#5 Kit
tento návrh jsem jen narychlo sestrojil ve Workbench a nazvy se takhle dali automaticky, jinak to mám pojmenovaný jinak... Nechci sem dávat, přímo strukturu dtb.

Nahlásit jako SPAM
IP: 88.146.225.–
Kit+15
Guru
26. 3. 2014   #8
-
0
-

#7 Taiwan
Problém je v tom, že máš překřížené vazby mezi tabulkami. Tedy špatný návrh.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Taiwan
~ Anonymní uživatel
10 příspěvků
26. 3. 2014   #9
-
0
-

Jinak skutečně v table4 jsou odkazy na table1, table2, table3. Stejne tak i v table5 jsou odkazy na table1, table2, table3, table4. Nevidím v tom nějaký problém a dost mi to usnadňuje práci, protože je jednodušší vzít jeden řádek z jedné tabulky a s ním i všechny odkazy na související věci, než to nějak dohledávat....

Nahlásit jako SPAM
IP: 88.146.225.–
Taiwan
~ Anonymní uživatel
10 příspěvků
26. 3. 2014   #10
-
0
-

#8 Kit
To znamená konkrétně co? :)

Nahlásit jako SPAM
IP: 88.146.225.–
Rek
~ Anonymní uživatel
1 příspěvek
27. 3. 2014   #11
-
0
-

#9 Taiwan
Zkus použít mensam iunctis v mysql. 

Nahlásit jako SPAM
IP: 147.229.242.–
z
~ Anonymní uživatel
268 příspěvků
27. 3. 2014   #12
-
0
-
Nahlásit jako SPAM
IP: 78.156.159.–
Mick
~ Anonymní uživatel
2 příspěvky
27. 3. 2014   #13
-
0
-

#12 Rek
No, doporučil bych spíš GAUDEAMUS_IGITUR()

Nahlásit jako SPAM
IP: 192.99.8.–
Kit+15
Guru
27. 3. 2014   #14
-
0
-

#10 Taiwan
To znamená, že jsi to špatně navrhl a protože vůbec netušíme, co vlastně navrhuješ, nemůžeme ti ani pomoct.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Taiwan0
Duch
31. 3. 2014   #15
-
0
-

#14 Kit
No kdyz je to dulezite, tak table1 = klienti, table2 = zadosti klienta, table3 - definice prenosu, table4 - statusy prenosu (v jakym kroku je zadost v prenosu), table5 - statusy-vysledky (jeden status muze mit vice vysledku, podle toho v jake casti prenosu se prave nachazi)

No a praxe je takova, ze potrebuju z table5 zjistit jaky klient mel ten nebo onen vysledek. Jako muzu vyhazet ty dalsi sloupce s IDckama a nechat tam pouze odkaz na predchazejici tabulku, tzn ze v table5, by byl odkaz pouze na table4. Jenze kdyz pak budu chtit vytahnout vsechny vysledky pro klienta z table5, tak to bude docela dlouhej a pro me temer nepouzitelnej prikaz. Musel bych z table5 nacist table4, tam zjistit jaka to je zadost(table2) a pak se teprve dohrabat k tomu, komu ta zadost patri (table1). Tzn ze nemohu pouzit jednoduchej prikaz where klienti_id (table1_id) = x

Nahlásit jako SPAM
IP: 88.146.225.–
peter
~ Anonymní uživatel
4002 příspěvků
31. 3. 2014   #16
-
0
-

"A když v table1 smažu záznam a v table5 je více radku odkazujicich na table4, tak mi tam vždycky nějakej zůstane. Jak jsem již psal výše."

Mozna, bys v tom workbench mohl prepnout zobrazeni tak, aby spojil primo sloupce a ne to sloucil do jednoho spojeni.

Sis, ten popis, To si musim nakreslit :)
Ty duplicity indexu urcite nejsou spravne, pokud na to mas pripojene propojovaci prikazy. To bys sem musel dat export struktury tech tabulek z workbench, aby to clovek mohl zkouset a sql prikazy, ktere pouzivas pro to delete, (select).

"kdyz pak budu chtit vytahnout vsechny vysledky pro klienta"
Neni to takova hruza.

SELECT e.jmeno, a.vysledek
FROM vysl a
  LEFT JOIN prenos_stav b ON b.id=a.id_prenos_stav
  LEFT JOIN prenos c ON c.id=b.id_prenos
  LEFT JOIN zadost d ON d.id=b.id_zadost
  LEFT JOIN klient e ON e.id=d.id_klient
WHERE e.klient='lojza'
Nahlásit jako SPAM
IP: 2001:718:2601:400:0:5efe:...–
Taiwan0
Duch
31. 3. 2014   #17
-
0
-

Koukám, že psát na toto fórum je docela otravné a to myslim především díky individuum, kteří umějí akorát postovat nechutné obrázky a nic víc, možná by měl server přehodnotit strategii neregistrovaných uživatelů....

#17 peter

Zajímavé je, že mi workbench tuto strukturu takto nabídne automaticky a pak s ní mysql neumí pracovat... Pořád mi nedochází v čem je takový problém? V tom, že tam mám duplicitní idcka? No a co? tak tam jsou?

 jako toto:

SELECT e.jmeno, a.vysledek
FROM vysl a
  LEFT JOIN prenos_stav b ON b.id=a.id_prenos_stav
  LEFT JOIN prenos c ON c.id=b.id_prenos
  LEFT JOIN zadost d ON d.id=b.id_zadost
  LEFT JOIN klient e ON e.id=d.id_klient
WHERE e.klient='lojza'

vs toto:

SELECT * FROM vysledky WHERE klienti_id = "idecko"

je docela rozdíl a to jak ve složitosti zápisu, tak podle mne i v času potřebném pro vykonání příkazu...

Jinak nepoužívám žádné speciální příkazy. Databaze je vlastne obrazem trid v PHP, takze da se rict ze vzdy nacitam cely radek (1 radek = 1 objekt) a stejne tak kdyz ho chci smazat tak mám pouze prikaz:

DELETE FROM klienti WHERE id="idcko"


no a tento prikaz když provedu a ve vysledcich je vice radku patrici k jednomu klientovi / zadosti tak se mi nesmazou vsechny....

Nahlásit jako SPAM
IP: 88.146.225.–
peter
~ Anonymní uživatel
4002 příspěvků
31. 3. 2014   #18
-
0
-

Ale sql prikazy na vytvoreni struktury jsi nedal. Tam je definovane, co s cim mas jak propojene pres prikazy. To na obrazku videt neni. Bez prikazu se to obvykle samo neudela.

Nahlásit jako SPAM
IP: 2001:718:2601:400:0:5efe:...–
Taiwan0
Duch
31. 3. 2014   #19
-
0
-

#18 peter
Jakto, že to není patrné z obrázku? Ty nazvy sloupcu nejsou voleny jen tak... vsude je ondelete - cascade. Tak treba sloupec table4_table2_table1_idtable1 odkazuje na table2_table1_idtable1 v table4 atd.

Nahlásit jako SPAM
IP: 88.146.225.–
Taiwan0
Duch
31. 3. 2014   #20
-
0
-

Kdyz dam do table5 odkaz primo na table1, misto toho aby to tu hodnotu bralo z table4, tak to funguje normalne. asi to budu muset takhle predelat....

Nahlásit jako SPAM
IP: 88.146.225.–
peter
~ Anonymní uživatel
4002 příspěvků
1. 4. 2014   #21
-
0
-

Priklad, co by bylo dobre sem dat, ale bude to asi z oracle. Tady toto si muzu dat do phpmyadmina a mit stejnou tabulku, jako mas ty. S tim obrazkem si muzu akorat tak cmarat v gimpu, nic vic. Teda, pokud mas zajem resit, proc ti ty table1-5 nefunguje.

CREATE TABLE parent (id INT NOT NULL,
PRIMARY KEY (id)) ENGINE=INNODB;

CREATE TABLE child (id INT, parent_id INT,
INDEX par_ind (parent_id),
CONSTRAINT constraint_test
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE) ENGINE=INNODB;

Nahlásit jako SPAM
IP: 2001:718:2601:400:0:5efe:...–
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, 2 hosté

Podobná vlákna

::delete — založil Koudis

Delete [] — založil Robo

C++ - BVS - delete — založil tomas

Delete v GridView — založil lost

Delete na pointer — založil Kolemjdouci

 

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