SQL Trigger erstellen, welcher Lücken auffüllt

_CH_K_1991_

Lieutenant
Registriert
Nov. 2008
Beiträge
772
Hallo zusammen

Ich möchte ein Trigger auf folgende Tabelle (Post) erstellen:

[TABLE="class: grid, width: 200"]
[TR]
[TD]IDP[/TD]
[/TR]
[TR]
[TD]IDU[/TD]
[/TR]
[TR]
[TD]platzierung[/TD]
[/TR]
[TR]
[TD]posttitel[/TD]
[/TR]
[TR]
[TD]postdate[/TD]
[/TR]
[TR]
[TD]post[/TD]
[/TR]
[TR]
[TD]anzeigezeit[/TD]
[/TR]
[TR]
[TD]filelink[/TD]
[/TR]
[/TABLE]

Ich möchte, wenn man ein Post löscht, dass die entstehende Lücke in der Platzierungs Nummerierung wieder durch die folgenden Post's aufgefüllt wird. Das wird benötigt um die Post durch eine while Schlaufe im PHP aufzurufen (immer durch ein +1 bis der letzte Post aufgerufen wurde.

Ich habe momentan folgenden Code, welcher natürlich noch nicht funktioniert:
Code:
CREATE TRIGGER PlatzierungAnpassen
AFTER DELETE ON Post
FOR EACH ROW
UPDATE Post
SET Post.Platzierung = SELECT Platzierung FROM Post //Wie geht es hier weiter?


END

Besten Dank für Hinweise und Hilfen, denn ich arbeite das erste Mal mit einem Trigger ;-)

PS: Es handelt sich bei der Datenbank um eine MySQL Datenbank

Gruss
​Matthias
 
Wie wärs mit
Code:
update post set Platzierung=Platzierung-1 where Platzierung>ALT

Versteh ich das im Subtext richtig, dass du in PHP die Posts so darstellst?
PHP:
for($i=0;$i<10;$i++){
$p=query_post($i);
echo_post($p);
}
Wenn das so ist, dann machst du definitiv was /*falsch*/ ineffizient.
PHP:
$query=mysql_query('select....');
while($p=mysql_fetch($query))
echo_post($p);
Jeweils natürlich an die Zielumgebung angepasst.
 
Hey
Danke viel mals für deine Antwort.
Ich bin erst jetzt dazu gekommen das ganze auszuprobieren.

Eine Frage hätte ich noch, da es noch nicht ganz funktioniert.
Könntest mir erklären was es mit dem "ALT" am Schluss des Query auf sich hat?

Besten Dank
Gruss
Matthias

PS: Danke für den Tipp im PHP
 
http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html
Ich bin von Haus aus zu faul, die richtige Syntax nachzuschlagen, ersetz ALT durch OLD.Platzierung in deinem TRIGGER und du bist auf dem richtigen Weg.

Die Tipps in PHP ermöglichen dir, dass du auf diese UPDATE-Anweisung und die Platzierung-Spalte verzichten kannst. SQL ist (normalerweise) mächtig genug, dass die Position eines Datensatzes nicht abgespeichert werden muss.
 
Hey Hancock

Danke für deine rasche Antwort. Danke auch für das nachschlagen der Referenz, da ich eben nur nach Alt in Verbindung mit MySQL gesucht habe bin ich nicht auf OLD gekommen :/

Leider bekomme ich bei jetzt folgende Fehlermeldung:

#1442 - Can't update table 'Post' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

SQL Query:
Code:
DELETE FROM `Post` WHERE `IDP` = 2

Der darauffolgende Trigger:
Code:
UPDATE Post SET Platzierung = Platzierung - 1
WHERE Platzierung > OLD.Platzierung


Das hat doch folgenden Zusammenhang:
Ich lösche einen Eintrag aus der Tabelle und gleichzeitig möchte ich nochmals ein Update auf die Tabelle durchführen was aber eben nicht erlaubt ist, stimmt das?

Wie könnte ich dieses Problem umgehen?

Oder muss ich sogar den ganzen Trigger komplett in den SQL Query des Delete Statements integrieren?

Danke für weitere Hinweise
Schönen Abend
Gruss
 
Danke dir.
Ich werde das über das WE näher anschauen.
Gruss
 

Ähnliche Themen

Zurück
Oben