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.
Fórum › MySQL
Problém s ON DELETE
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á:
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.
#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
#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í.
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....
#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
"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'
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....
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;
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C++ - BVS - delete — založil tomas
Delete v GridView — založil lost
Delete na pointer — založil Kolemjdouci
Moderátoři diskuze