ugrás a tartalomhoz

Összekapcsolt táblák adatainak törlése MySQL-ben

Anonymous · 2005. Dec. 15. (Cs), 20.33
Sziasztok!

Az MS Access-ben létezik egy olyan checkbox (a táblák közti reláció létrehozásakor), hogy ha törlik az egyik sort, akkor a másik táblá(k)ból is törlődjenek az összekapcsolt sorok.
Ezt hogy lehet megvalósítani mysql+php-val?
Köszi a válaszokat!

Üdv:

TB
 
1

Adatbázis

Bártházi András · 2005. Dec. 15. (Cs), 20.54
Ennek nincs köze (feltétlenül) a PHP-hez. MySQL-ben triggerekkel lehet megvalósítani, a MySQL 5.0-s verziótól. Ha nincs MySQL 5.0, akkor meg simán törlöd először a főtáblát, majd az altáblát, és voálá. Esetleg közben WRITE LOCK-olod a két táblát. De a triggeres az szebb megoldás.

Illetve adatbázisból nem törlünk, mert nem arról szól a dolog - valamennyivel szebb, ha csak letiltod a törlendő sort.

-boogie-
2

re

Anonymous · 2005. Dec. 15. (Cs), 20.56
Igazad van, a törlés tényleg nem szép dolog, csak kíváncsi voltam :)

A WRITE LOCK hogy működik?
4

Doksi?

Bártházi András · 2005. Dec. 15. (Cs), 21.05
A MySQL-nek elég jó doksija van: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

-boogie-
3

Letiltás - hogyan?

fberci · 2005. Dec. 15. (Cs), 21.03
Ezt a letiltást hogyan lehet megvalósítani? Ennek mi lesz a következménye, pl. csak írható nem lesz a sor, vagy megjelenítéskor el is tűnik, ha nem, akkor hogyan lehet megcsinálni, hogy ne jelenjen meg?

Üdv.: fberci
5

READ LOCK, WRITE LOCK

Bártházi András · 2005. Dec. 15. (Cs), 21.08
A READ LOCK nem enged írni, csak olvasni, a WRITE LOCK pedig sem írni, sem olvasni nem enged. Amikor egy (PHP/Perl/etc.) kliens nem megengedett kéréssel fordul az adatbázishoz, a MySQL szerver elkezdi várakoztatni, amíg feloldásra nem kerül az adott LOCK. Ez tábla szintű lockolás, nem sor szintű, az adott sor megjelenéséhez, eltűnéséhez pedig végképp nincsen köze, csak arról szól, hogy egy lekérdezés közben egy másik szál ne olvashasson ki inkonzisztens adatot.

-boogie-
7

Letiltás - hogyan?

Anonymous · 2005. Dec. 15. (Cs), 22.38
A táblához hozzáadsz egy "deleted", vagy "torolt" nevű mezőt TINYINT(1) default 0 típussal, és ha törölsz, akkor nem törölsz, hanem ennek a mezőnek az értékét update-eled 1-re.
Az összes lekérdezést viszont úgy írod meg, hogy a többi feltétel mellett mindig szerepel az is, hogy "AND deleted=0".
Aztán ha a kuncsaft rádtelefonál éjfélkor, hogy véletlenül törölt valami fontosat, akkor nagy kegyesen visszacsinálod neki, és istenként fog tisztelni. Ennyi.

Gyulus
6

innodb

wiktor · 2005. Dec. 15. (Cs), 21.34
InnoDB táblák esetén lehet idegen kulcsokat is definiálni, nem kell feltétlenül trigger.

http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html