ugrás a tartalomhoz

InnoDB foreign key - a törlést hogyan propagáljam más táblákba?

janoszen · 2006. Júl. 5. (Sze), 20.34
Sziasztok!

Egy eléggé érdekes kérdésem lenne. Lehetséges, hogy a fától nem látom az erdőt és halál RTFM lesz, de ez merül fel bennem:

Távoli kulcsokkal lehet olyat csinálni, hogy ON DELETE CASCADE. No de, ez csak akkor működik, ha a másik tábla változik. Lehetséges valahogyan, implicit módon az aktuális táblából propagálni egy törlést a behivatkozott táblába?

A tárolt eljárások nem megoldás, mert ha jól olvastam, csak MySQL 5-től vannak és a szerveren csak 4-es fut, valamint a táblahivatkozás megfordítása sem lehetséges, mert arra az egy táblára többen hivatkoznak.

Köszi

János
 
1

pontosíthatnád egy kicsit

Hodicska Gergely · 2006. Júl. 5. (Sze), 21.33
Nem teljesen tiszta, hogy mit szeretnél, kicsit pontatlan a kérdés (pedig másokat ezért szoktál szapulni ;)). Olyan, mint "másik" tábla nincs: szülő és gyermek tábla van.

valamint a táblahivatkozás megfordítása sem lehetséges, mert arra az egy táblára többen hivatkoznak

Attól, hogy egy tábla egy kapcsolatban szülő tábla, attól még lehet egy másikban gyerek, szóval emiatt nyugodtan megfordíthatnád, viszont szerintem ezt nem egy ilyen funkcionális igény kéne befolyásolja, ha nem a domén logika szerint egy tervezői döntés eredménye kéne legyen.


Felhő
2

Kód

janoszen · 2006. Júl. 6. (Cs), 00.00
Legyen:

CREATE TABLE a
(
 id INT PRIMARY KEY
) TYPE=InnoDB;

CREATE TABLE b
(
 id INT PRIMARY KEY,
 mydatatype VARCHAR(255),
 myakey INT NOT NULL,

 INDEX imyakey (myakey),
 FOREIGN KEY (myakey) REFERENCES a(id) ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=InnoDB;

CREATE TABLE c
(
 id INT PRIMARY KEY,
 mydatatype INT,
 myakey INT NOT NULL,

 INDEX imyakey (myakey),
 FOREIGN KEY (myakey) REFERENCES a(id) ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=InnoDB;
Azt szeretném, ha a
DELETE FROM b;
parancs hatására törlődne az a-beli record, ha arra már nem mutat több távoli kulcs.
3

Hozzáfűzés...

janoszen · 2006. Júl. 6. (Cs), 00.08
Ha esetleg azon gondolkoznál, hogy ez mire jó, akkor tippként annyit mondok, hogy gondolj a filerendszerekben a hardlinkekre. Ott is törlődik a file, ha már nem mutat rá több hardlink... Na, meg egy adag kényelem is van a dologban, hogy a logikát vinném az adatbázisba.
4

trigger nélkül nem fog menni

Hodicska Gergely · 2006. Júl. 6. (Cs), 00.51
Ezt szerintem nem tudod trigger nélkül megcsinálni.


Felhő
5

MySQL 5

Anonymous · 2006. Júl. 6. (Cs), 08.05
Ami csak MySQL 5-ben van, ugye?
7

Igen

Hodicska Gergely · 2006. Júl. 6. (Cs), 09.32
Ráadásul ott sem lesz feltétlenül egyszerű, mert igazából azt kell megállapítanod, hogy a szülő tábla adott sorára van-e még más táblákból hivatkozás. Nem tudom, hogy mysqlben az adatszótár mostm ilyen szinten van, de pl. Oracle alatt lehetett olyan tárolt eljárást írni, ami kapott egy táblanevet és egy idt, lekérdezte az adatszótárból, hogy erre a táblára milyen más táblák mutatnak és hogy azokban mi a külső kulcs mező neve, majd ezen a találati listán végigment, és megnézte, hogy van-e bennük olyan sor, ahol ezen kulcsmezőnek az értéke a paraméterül kapott id. Lehet, hogy a MySQL5-ben ez már szintén megvalósítható, de ezt per pillanat biztosra nem tudnám mondani.


Felhő
9

Akkor marad a PHP

janoszen · 2006. Júl. 6. (Cs), 10.06
Akkor marad a PHPból való törlés, vagy az ON DELETE RESTRICT és felülről törlünk, ha olyan a feladat. :P Köszi mindenesetre. :D Topic zárható. :)
6

szóhasználat

Táskai Zsolt · 2006. Júl. 6. (Cs), 09.24
a reláció az tábla. a hozzászólásodban lecserélnék minden "reláció"-t "kapcsolat"-ra. (a toldalékokat is igazítani kell persze).
Tasi
8

való igaz...

Hodicska Gergely · 2006. Júl. 6. (Cs), 09.34
... ebben a kontextusban ez nem jó szó. Javítva, köszi.


Felhő