• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Trigger in SQL - IF NOT UPDATE(column)

C64

Kaiser Alexander
Registriert
12.04.06
Beiträge
3.957
Hallo zusammen,
irgendwie bekomme ich es gerade nicht gebacken. Ich benötige einen Trigger, welcher mir bei einem Update eines Datensatzes das modified-Feld auf den CURRENT_TIMESTAMP setzt.... und zwar immer AUßER, wenn das Attribut position verändert wird... Irgendwie muss das doch mit IF NOT UPDATE funktionieren aber ich bekomme es nicht hin:

Meine Tabelle:
Code:
REATE TABLE IF NOT EXISTS `:prefix:mod_courseEntry` (
    `entryID` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `courseID` int(11) unsigned NOT NULL,
    `content` text NULL,
    `text` text NULL,
    `modified` DATETIME NULL,
    `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `userID` int(11) unsigned NULL,
    `seoURL` varchar(255) NOT NULL DEFAULT '',
    `position` smallint(11) unsigned NULL DEFAULT '1',
    PRIMARY KEY (`entryID`),
    CONSTRAINT `courses` FOREIGN KEY (`courseID`) REFERENCES `:prefix:mod_course`(`courseID`) ON DELETE CASCADE,
    CONSTRAINT `user` FOREIGN KEY (`userID`) REFERENCES `:prefix:users`(`user_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mein Versuch des Triggers (funktioniert nicht!):
Code:
CREATE TRIGGER `courseEntryUpdate` BEFORE UPDATE ON `:prefix:mod_courseEntry` FOR EACH ROW
    IF NOT UPDATE(position) BEGIN
        SET NEW.modified = CURRENT_TIMESTAMP
    END;

Entweder habe ich Tomaten auf den Augen oder ich bin doof...
 

zilVerGFX

Macoun
Registriert
26.12.08
Beiträge
118
Moin,

Code:
CREATE TRIGGER `courseEntryUpdate` BEFORE UPDATE ON `:prefix:mod_courseEntry`
  FOR EACH ROW
  BEGIN
    IF NEW.position <> OLD.position THEN
      SET NEW.modified = CURRENT_TIMESTAMP;
    END IF;
  END;


Habs jetzt nicht getestet, sollte aber klappen:
Schau ansonsten mal in die entsprechende Doku.
 

C64

Kaiser Alexander
Registriert
12.04.06
Beiträge
3.957
Das ist genau das, was ich nicht wollte ;)
Ich werde aber wohl doch den Trigger in PHP auslagern und nicht als Trigger umsetzen - dann kann ich auch noch ein paar andere Dinge einfacher checken... Könnte ich von einer höheren MySQL-Version ausgehen könnte, wäre es einfacher...

Trotzdem danke :)
(wobei mich interessehalber dennoch eine Lösung interessieren würde :rolleyes:)
 

zilVerGFX

Macoun
Registriert
26.12.08
Beiträge
118
Sorry, hab deine Frage zu schnell gelesen.
Mein Beispiel aber so umzuformulieren, dass es für deinen Fall passt - das bekommst du auch locker selbst raus :)

Code:
IF NEW.position = OLD.position THEN
...
ist äquivalent zu "Immer, außer wenn position verändert wurde".
 

C64

Kaiser Alexander
Registriert
12.04.06
Beiträge
3.957
Vielen Dank... habe mein Problem gefunden - so doof, dass es schon bescheuert ist ;)
Musste einen delimiter setzen... damit hat es dann auch funktioniert wie gewünscht ;)

Aber danke für deine Hilfe! :)