0 rows updated when that should have been 1.

FreeFun's profile image FreeFun posted 11 months ago in General Permalink

Hallo,

ich bin noch etwas neu in der SQL Sprache und bin mit HeidiSQL mega glücklich. Es hat mir enorm geholfen vieles zu verstehen und umzusetzen.

Nun versuche ich mir an Triggern und einer macht mir sehr zu schaffen.

CREATE TABLE IF NOT EXISTS `Spieler` (
  `Spieler_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Steam_ID` varchar(64) DEFAULT NULL,
  `Discord_ID` varchar(64) DEFAULT NULL,
  `Discord_Name` varchar(64) DEFAULT NULL,
  `Funcom_ID` varchar(64) DEFAULT NULL,
  `Funcom_Name` varchar(64) DEFAULT NULL,
  `Role_ID` varchar(64) DEFAULT NULL,
  `Alive_Since` datetime DEFAULT NULL,
  `Play_Time` int(64) DEFAULT 0,
  `Start_Time` int(64) DEFAULT NULL,
  `Death_Count` int(11) unsigned NOT NULL DEFAULT 0,
  `Online` int(11) DEFAULT NULL,
  PRIMARY KEY (`Spieler_ID`) USING BTREE,
  KEY `Servers` (`Online`) USING BTREE,
  KEY `Role_ID` (`Role_ID`),
  CONSTRAINT `Role_ID` FOREIGN KEY (`Role_ID`) REFERENCES `Roles` (`Role_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `Server_ID` FOREIGN KEY (`Online`) REFERENCES `Servers` (`Server_ID`) ON DELETE SET NULL ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Ich möchte in Play_Time die Sekunden Speichern die der Spieler Online war. Egal welchen Wert ich in Play_Time schreibe, wie 120 dann kommt "0 rows updated when that should have been 1." und es kann nicht gespeichert werden. Daher komm ich bei meinem Trigger nicht weiter.

Vielleicht denk ich nur falsch. Kurz zur Erklärung was ich eigentlich für einen Trigger erstellen möchte. Wenn Online ein Wert hat der nicht NULL ist, soll die Jetzt Zeit in Start_Time gespeichert werden. Wenn der Wert in Online sich in NULL ändert dann soll die Jetzt Zeit mit der aus Start_Time verrechnet werden um diese Zeit auf Play_Time zu addieren.

Ich hoffe das war verständlich.

Beste Grüße FreeFun

ansgar's profile image ansgar posted 11 months ago Permalink

Da sehe ich jetzt keinen Trigger. Den solltest du einmal posten hier.

Vermutlich müsste der so ähnlich aussehen:

Description

Wobei ich damit auch einen Fehler bekomme - sinngemäß: kann Tabelle nicht über den Trigger updaten weil sie schon durch den User ge-updated wurde.

FreeFun's profile image FreeFun posted 11 months ago Permalink

Wobei ich damit auch einen Fehler bekomme - sinngemäß: kann Tabelle nicht über den Trigger updaten weil sie schon durch den User ge-updated wurde.

Genau daran scheitert es mittlerweile.

(Ich darf keine Bilder Verlinken daher im Anhang)

Dieser Trigger funktioniert nun aber er wird vor dem Update der Tabelle ausgeführt und es gibt keine Bedingung. (Spieler_ID)

Nach dem Update bekomme ich kein SET und wenn ich so wie du ein Update danach mache, meckert er weil die Tabelle bereits ge-updatet wurde.

Im Kopf weiß ich was ich will und wie die Funktionale Aufbau sein müsste:

Wenn Online ein Wert hat der nicht NULL ist, soll die Jetzt Zeit in Start_Time gespeichert werden. Wenn der Wert in Online sich in NULL ändert dann soll die Jetzt Zeit mit der aus Start_Time verrechnet werden um diese Zeit auf Play_Time zu addieren.

Am ende möchte ich die gesamte Spielzeit so festhalten.

1 attachment(s):
  • VM3rI8tfir
ansgar's profile image ansgar posted 11 months ago Permalink

Versuche zuerst das eine IF testweise zu entfernen, dann kannst du das Problem einkreisen. Mit dem OLD. und NEW. ist evtl. irgendwo ein Dreher drin. Ich konnte es gerade hiermit zum Laufen bringen:

BEGIN
  IF OLD.Online IS NOT NULL  AND NEW.Online IS NULL THEN
    SET NEW.Play_Time = OLD.Play_Time + (UNIX_TIMESTAMP() - OLD.Start_Time);
  END IF;
END
FreeFun's profile image FreeFun posted 10 months ago Permalink

Verständnis frage: Benötige ich die WHERE Bedingung überhaupt? Klar gibt es mehrere Zeilen in der Tabelle aber der Trigger Arbeitet doch eh nur in der Zeile die ge-updatet wurde, oder nicht?

Denn meine Lösung da oben funktioniert ja auch wenn es keine Bedingung gibt und dieser vor dem Update ausgeführt wird.

ansgar's profile image ansgar posted 10 months ago Permalink

Das WHERE brauchst du tatsächlich nicht. Die beiden NEW. und OLD. verweisen bereits auf die betroffene Zeile.

FreeFun's profile image FreeFun posted 10 months ago Permalink

Perfekt, danke dir :)

Es gibt Tatsache nichts besseres als in der Praxis zu Testen und zu wachsen.

Datenbanken waren für mich früher immer etwas empfindliches und schwer zu verstehenden Konzept. Seit ich HeidiSQL Nutze hat sich das stark geändert.

Ich danke dir für dieses tolle Programm, mach weiter so!

Beste Grüße FreeFun

Please login to leave a reply, or register at first.