MySQL: Dzēšana no vairākām tabulām vienlaicīgi
28. April, 2007, 11:28 PamācībasVarbūt ne visi ir pamanījuši, bet MySQL jau kopš 4.0 versijas piedāvā iespēju dzēst vienlaicīgi no vairāk tabulām ar vienu pieprasījumu. Izskatās tas, piemēram, šādi:
DELETE
x,y,z
FROM
`tabulax` x,
`tabulay` y,
`tabulaz` z
WHERE
x.id = 1 AND
x.id = y.tabulax_id AND
y.id = z.tabulay_id
Šis pieprasījums no tabulasx izdzēstu ierakstu ar id vērtību 1 un no tabulasy ierakstu, kam tabulax_id vērtība ir vienāda tabulas_x vērtību id. Un tā tālāk. Respektīvi - parasts džoins (sql join). Manos piemēros ir kross-džoins, bet var izmantot jebkuru citu džoina veidu.
Ir iespējams arī atlasīšanai izmantot vairāk tabulas, bet dzēst tikai no dažām:
DELETE
x
FROM
`tabulax` x,
`tabulay` y
WHERE
...
Alternatīva sintakse:
DELETE FROM
x
USING
`tabulax` x,
`tabulay` y
WHERE
...
Dzēšot no vairākām tabulām vienlaicīgi, jāatceras, ka nav iespējams izmantot LIMIT vai ORDER BY.
Padoms: Varbūt tas ir pašsaprotami, bet rakstot pieprasījumus, lai dzēstu no vairākām tabulām reizē, necentieties uzreiz rakstīt sākot ar DELETE .... Labāk vispirms uzrakstiem parastu SELECT pieprasijumu, un tad, kad redzat, ka atlasās pareizie dati, tad vienkārši nomainiet to SELECT pret DELETE.
Resursi:



28. April, 2007, 11:56
Vai priekš tam nebūtu jālieto kaskadētā dzēšana? Tas gan laikam kopā tikai ar InnoDB tabulām.
28. April, 2007, 12:25
Jā, tas attiecas tikai uz InnoDB tabulām.
Vispār MySQL manuālim arī ir ko teikt par to:
1. May, 2007, 13:24
Es parasti izmantoju joinus ;)… Tjipa:
DELETE a, b, c
FROM tab1 AS a,
LEFT JOIN tab2 AS c
ON (a.id = c.pid)
INNER JOIN tab2 AS b
ON (b.pid = c.id AND a.id = b.hid)
WHERE a.kaka = ‘baigaa kaka’
ORDER BY c.id DESC
LIMIT 3
:DDDD
24. March, 2008, 0:23
[…] MySQL: Dzēšana no vairākām tabulām vienlaicīgi […]