Forum: PC-Programmierung MySQL Force Update - wenn Value bereits gleich ist


von Rene K. (xdraconix)


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

von Ob S. (Firma: 1984now) (observer)


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?

von Rene K. (xdraconix)


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.

von Ein T. (ein_typ)


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

von Ein T. (ein_typ)


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

von Daniel A. (daniel-a)


Angehängte Dateien:

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

von Rene K. (xdraconix)


Lesenswert?

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
Noch kein Account? Hier anmelden.