Ich würde gerne mal ein Thema ansprechen, das ich bis jetzt immer ignoriert habe.
Ich habe folgende MySQL-Tabellen:
- user
- gallery
Hierin sind alle grundsätzlichen Galerie-Infos gespeichert.
Titel der Galerie, ob Galerie mit Passwort geschützt, ...
- image:
Hierin sind alle Infos zu den Galerie-Bildern gespeichert.
Die Spalte no (Typ unsigned int) dient dazu, die Bilder sortieren zu können.
Aus der Tabelle image soll nun ein Datensatz gelöscht werden.
Die SQL-Befehle sehen wie folgt aus:
Der Select
- um zu kontrollieren, ob es Bild und zugehörige Galerie und User überhaupt gibt und
- um mittels FOR UPDATE Datensätze der Tabelle image zu sperren:
Code:
SELECT
user.id AS userId,
user.name AS userName,
gallery.id AS galleryId,
gallery.title AS galleryTitle,
image.id,
image.no
FROM
user
INNER JOIN gallery ON (user.id = gallery.user_id)
LEFT JOIN image ON (gallery.id = image.gallery_id)
INNER JOIN (
SELECT gallery_id
FROM image
WHERE id = $iImageId
) AS i ON (image.gallery_id = i.gallery_id)
FOR UPDATE
Der eigentliche Löschbefehl:
Code:
DELETE FROM image WHERE id = $iImageId
Sauber durchnummerieren (zum Sortieren der Bilder erforderlich):
Code:
UPDATE image SET
no = (@no := @no + 1)
WHERE
gallery_id = $iGalleryId AND
(SELECT @no := -1)
ORDER BY no, id
Ich hätte nun eine Frage zu dem FOR UPDATE. Bei diesem SELECT joine ich 3 Tabellen. Aufgrund des FOR UPDATEs gehe ich davon aus, dass in allen 3 Tabellen Datensätze gesperrt werden. Doch eigentlich möchte ich das überhaupt nicht. Eigentlich sollen ausschließlich nur die Datensätze der Tabelle image gesperrt werden. Ist das in MySQL überhaupt möglich?