Ein etwas ungewöhnliches Anliegen: Ich weiß, das MySQL die Reihe nicht updated wenn die Werte die gleichen sind. Das ist natürlich auch völlig sinvoll. Nun habe ich aber einen Sonderfall, ich eine Tabelle in welcher der Status eines mehrerer Services gespeichert wird. Dort befindet sich auch ein Timestamp on update - nun ist die Sache so, das der Status der Services mit 0 gespeichert werden, und dann das Datum beim ändern (oder eben nicht) gespeichert wird. Jedoch ändert sich natürlich das Timestamp on update nicht, weil ja der Status bei der nächsten Prüfung wieder 0 ist und somit kein Update stattfindet. Kann man sich das irgendwie erzwingen, das MySQL dies dennoch als Update sieht?!
Rene K. schrieb: > Ein etwas ungewöhnliches Anliegen: Ähem, ja. Das Problem ist: dir fehlen die richtigen Begriffe, um es auch nur darzustellen... > Ich weiß, das MySQL die Reihe nicht updated wenn die Werte die gleichen > sind. MySql kennt keine "Reihe", genausowenig wie jede andere SQL-Datenbank. > Nun habe ich aber einen Sonderfall, ich eine Tabelle in welcher der > Status eines mehrerer Services gespeichert wird. Dort befindet sich auch > ein Timestamp on update - nun ist die Sache so, das der Status der > Services mit 0 gespeichert werden, und dann das Datum beim ändern (oder > eben nicht) gespeichert wird. Also:was ist eine "Reihe" und wie hängt das mit der Tabelle zusammen?
row - ich meinte natürlich eine row (Was für mich im übrigen im Deutschen immer noch eine Reihe ist.) Hab es jetzt selbst gelöst. Ich habe eine Spalte (Achja, Sorry: column) mit einer Zufallszahl, welche jedes mal mit geänderten Werten beschrieben wird. Und somit ein update auf jeden Fall durchgeführt wird.
Rene K. schrieb: > Hab es jetzt selbst gelöst. Ich habe eine Spalte (Achja, Sorry: column) > mit einer Zufallszahl, welche jedes mal mit geänderten Werten > beschrieben wird. Und somit ein update auf jeden Fall durchgeführt wird. Wenn Du ohnehin immer etwas schreibst... warum dann nicht gleich etwas Sinnvolles wie einen "changedAt"-Timestamp? So etwas kann man doch im Zweifelsfall immer mal brauchen... :-)
Rene K. schrieb: > Ich weiß, das MySQL die Reihe nicht updated wenn die Werte die gleichen > sind. Das ist natürlich auch völlig sinvoll. > > Nun habe ich aber einen Sonderfall, ich eine Tabelle in welcher der > Status eines mehrerer Services gespeichert wird. Dort befindet sich auch > ein Timestamp on update - nun ist die Sache so, das der Status der > Services mit 0 gespeichert werden, und dann das Datum beim ändern (oder > eben nicht) gespeichert wird. > > Jedoch ändert sich natürlich das Timestamp on update nicht, weil ja der > Status bei der nächsten Prüfung wieder 0 ist und somit kein Update > stattfindet. > > Kann man sich das irgendwie erzwingen, das MySQL dies dennoch als Update > sieht?! Es würde mich doch SEHR wundern, wenn zuträfe, was Du sagst. Eine Richtige Datenbank (tm) wie PostgreSQL verhält sich jedenfalls nicht so: da wird in einer Triggerfunktion die "updatedAt"-Spalte gesetzt, und so befinden sich neue Werte im Record, der dann selbstverständlich auch geschrieben wird. create.sql:
1 | DROP TABLE IF EXISTS ding; |
2 | |
3 | CREATE TABLE ding ( |
4 | id SERIAL PRIMARY KEY, |
5 | createdAt TIMESTAMP DEFAULT NOW(), |
6 | updatedAt TIMESTAMP DEFAULT NOW(), |
7 | zahl INTEGER |
8 | ); |
9 | |
10 | CREATE OR REPLACE FUNCTION ding_on_update() |
11 | RETURNS TRIGGER AS $$ |
12 | BEGIN |
13 | NEW.updatedAt = NOW(); |
14 | RETURN NEW; |
15 | END; |
16 | $$ LANGUAGE 'plpgsql'; |
17 | |
18 | CREATE OR REPLACE TRIGGER ding_update_trigger |
19 | BEFORE UPDATE ON ding |
20 | FOR EACH ROW EXECUTE FUNCTION ding_on_update(); |
21 | |
22 | INSERT INTO ding(zahl) VALUES (1), (2), (3), (4); |
update.sql:
1 | UPDATE ding SET zahl = 2 WHERE zahl = 2; |
2 | UPDATE ding SET zahl = 4 WHERE zahl = 4; |
Der Code funktioniert mit PostgreSQL einwandfrei. Wenn MySQL das anders macht (abgesehen von syntaktischen Unterschieden, natürlich), dann ist das wohl ein guter Moment, Deine Entscheidung für MySQL einmal intensiv zu überdenken. :-)
Ich hab das mal nach MySQL übersetzt:
1 | CREATE TABLE `ding` ( |
2 | `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, |
3 | `createdAt` DATETIME NOT NULL DEFAULT NOW(), |
4 | `updatedAt` DATETIME NOT NULL DEFAULT NOW(), |
5 | `zahl` INT NOT NULL |
6 | ); |
7 | CREATE OR REPLACE TRIGGER `ding_update_trigger` BEFORE UPDATE ON `ding` FOR EACH ROW SET NEW.`updatedAt`=NOW(); |
8 | INSERT INTO `ding`(`zahl`) VALUES (1), (2), (3), (4); |
9 | SELECT * FROM `ding`; |
10 | DO sleep(10); |
11 | UPDATE `ding` SET `zahl` = 2 WHERE `zahl` = 2; |
12 | UPDATE `ding` SET `zahl` = 4 WHERE `zahl` = 4; |
13 | SELECT * FROM `ding`; |
Ich hab das mal unter 10.6.11-MariaDB-1 Debian getestet. Die Zeit wurde da wie erwartet angepasst (siehe Anhang).
Update: ja tatsächlich, mit dem richtigen Trigger funktioniert es nun tadellos. Ich danke euch für diesen Gedankenanstoß.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.