MySQL Force Update - wenn Value bereits gleich ist

OP #7545876
Lesenswert?

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?!

(Firma: 1984now) #7545885
Lesenswert?

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?

OP #7545892
Lesenswert?

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.

#7545940
Lesenswert?

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... :-)

#7545957
Lesenswert?

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. :-)

#7546260
Lesenswert?

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).

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren