MySQL In MySQL Funktionen erstellen, wenn Zelle leer dann andere Zelle ändern?

Xearox

Mitglied
Moin moin,

ich habe da mal eine Frage. Ich habe bisher noch nie mit Funktionen in MySQL direkt gearbeitet.

Ich habe eine Tabelle, in der eine Zelle von extern gefüllt wird oder eben nicht. Falls diese Zelle leer sein sollte, soll eine andere Zelle von 1 auf 0 geändert werden. Gleiches gilt, wenn die eine Zelle Text enthält, soll die andere Zelle von 0 auf 1 geändert werden.

Ist dies mit diesen Funktionen in MySQL direkt realisierbar? Und falls ja, wie funktioniert das? Die Syntax von MySQL bzw. die für Funktionen scheint sehr stark Pascal zu ähneln.

Wäre echt dankbar, wenn mir da jemand eine Gute Seite für empfehlen kann, um sich da mal einzuarbeiten oder mir da ein passendes Snippet zu liefern =)

Vielen Dank =)

Ich weiß nicht, ob ich das im richtigen Foren Bereich poste, also bitte verschieben, wenns falsch ist ;-)
 
Ja, du musst einen Update-Trigger definieren. So in etwa:

SQL:
CREATE TRIGGER someTrigger AFTER UPDATE ON tabelle
FOR EACH ROW UPDATE tabelle SET feld2 = IF(feld1 IS NULL, 0, 1)
 
Ich hab das funktioniert, allerdings hab ich dann immer wieder die Fehlermeldung:
Code:
[ERROR][15:07:38] Can't update table 'accounts' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
[ERROR][15:07:38] HY000
[ERROR][15:07:38] 1442

Habs dann bissl umgeschrieben und zwar in das hier:
SQL:
CREATE DEFINER=`root`@`localhost` TRIGGER `xfriendsdev`.`accounts_AFTER_UPDATE` AFTER UPDATE ON `accounts` FOR EACH ROW
BEGIN
    IF 'PlayingOn' <> '' THEN
        INSERT INTO `accounts`(InGame) VALUES (1);
    END IF;
    IF 'PlayingOn' = '' THEN
        INSERT INTO `accounts` (InGame) VALUES (0);
    END IF;
END

Und nun bekomme ich die Fehlermeldung:
Code:
[ERROR][15:16:14] Could not update online status in account table for 1dc3a9dc-b24e-445d-b4a6-e3ad5cccd997!
[ERROR][15:16:14] Field 'UUID' doesn't have a default value
[ERROR][15:16:14] HY000
[ERROR][15:16:14] 1364

Und das verstehe ich überhaupt nicht. Warum wird UUID im Trigger überhaupt angesprochen?!
Am Update selbst kann es nicht liegen, da sobald ich den Trigger weg nehme, läuft es ohne Probleme weiter :/

Java:
String sql = "UPDATE accounts SET InGame = ? , PlayingOn = ? WHERE UUID = ?";
 
Zuletzt bearbeitet:
In deinem Trigger insertest du ja auch. Natürlich brauchst du die UUID für eine neue Zeile. Du kannst mal dashier versuchen:

SQL:
CREATE TRIGGER trigger AFTER UPDATE ON accounts FOR EACH ROW
SET InGame = IF(PlayingOn = '', 0, 1)

P.S.: Bennene deinen Trigger besser. Dass er auf die Tabelle accounts geht und AFTER UPDATE ausgeführt wird, weiss man schon. Bennene ihn nach dem, was er macht ("z.B. consistency_playingOn_inGame")
 
In deinem Trigger insertest du ja auch. Natürlich brauchst du die UUID für eine neue Zeile. Du kannst mal dashier versuchen:

SQL:
CREATE TRIGGER trigger AFTER UPDATE ON accounts FOR EACH ROW
SET InGame = IF(PlayingOn = '', 0, 1)

P.S.: Bennene deinen Trigger besser. Dass er auf die Tabelle accounts geht und AFTER UPDATE ausgeführt wird, weiss man schon. Bennene ihn nach dem, was er macht ("z.B. consistency_playingOn_inGame")

Ich glaub, ich stehe Mega aufm Schlauch.
Habe das nun so wie in deinem Beispiel.
SQL:
CREATE TRIGGER change_ingame_status AFTER UPDATE ON accounts FOR EACH ROW
SET InGame = IF(PlayingOn = '', 0, 1)

Fehler:
Code:
ERROR 1193: Unknown system variable 'InGame'
SQL Statement:
CREATE TRIGGER change_ingame_status AFTER UPDATE ON accounts FOR EACH ROW
SET InGame = IF(PlayingOn = '', 0, 1)

Füge ich nun ein NEW hinzu vor InGame:
SQL:
CREATE TRIGGER change_ingame_status AFTER UPDATE ON accounts FOR EACH ROW
SET NEW.InGame = IF(PlayingOn = '', 0, 1)

erhalte ich diese Fehlermeldung:
Code:
ERROR 1362: Updating of NEW row is not allowed in after trigger
SQL Statement:
CREATE TRIGGER change_ingame_status AFTER UPDATE ON accounts FOR EACH ROW
SET NEW.InGame = IF(PlayingOn = '', 0, 1)

Dazu habe ich das hier gefunden:
http://stackoverflow.com/questions/8061041/syntax-error-defining-mysql-trigger
http://stackoverflow.com/questions/25983350/error-creating-trigger-unknown-system-variable
http://stackoverflow.com/questions/...-trigger-causes-unknown-system-variable-error

Im Kern wird gesagt, das man NEW davor setzen sollte, aber das geht wiederum nur im Before.
 
Und was hindert dich daran daraus einen before trigger zu machen?

Ich habe eigentlich nach einem Weg gesucht, das ganze automatisch machen zu lassen, ohne einen Trigger, wie z.B. in Excel, das wenn eine Zelle Leer ist, soll eine andere einen bestimmten Wert bekommen. Daher hatte ich im Eingangsposting geschrieben, ob es eine Möglichkeit über Functions das zu machen. Dann hat Tobse Trigger vorgeschlagen.

Der Grund warum ich das ganze automatisiert haben möchte ist, dass es manchmal vorkommt, dass die Java Anwendung die Spalte InGame nicht ändert. Hab den Bug noch nicht gefunden, warum er das macht. Deswegen wollte ich, das die Datenbank das macht.

Nutze MySQL 5.6, wäre eventuell noch wichtig zu sagen.
 
Mal ganz davon abgesehen, dass alleine das vorhanden sein einer solchen Abhängigkeit schon zu 99% ein Designfehler in der Datenbank ist. Wenn eine Zeile oder Spalete etwas enthalten soll, wenn eine andere Zeile oder Spalte etwas enthältvoder nicht, dann ist das eine Redundanz die man niemals haben sollte.

Gruß

Claus
 
Ich habe eigentlich nach einem Weg gesucht, das ganze automatisch machen zu lassen, ohne einen Trigger, wie z.B. in Excel, das wenn eine Zelle Leer ist, soll eine andere einen bestimmten Wert bekommen. Daher hatte ich im Eingangsposting geschrieben, ob es eine Möglichkeit über Functions das zu machen. Dann hat Tobse Trigger vorgeschlagen.
Wenn die Datenbank automatisch etwas tun soll, sind Trigger schon der richtige Weg. Es ist aber keine gute Idee, in einem AfterUpdate-Trigger ein Update auf dieselbe Tabelle aufzurufen, denn das würde ja wieder den AfterUpdate-Trigger auslösen und der wieder ein Update und ... . Im BeforeTrigger hätte man aber noch die Möglichkeit, die Werte zu manipulieren, ohne einen weiteren Update-Befehl abzusetzen.

Wenn man viel Logik in die Datenbank legen möchte, können Trigger schon ein guter Weg sein. Aber als WorkAround um einen nicht auffindbaren Programmierfehler zu kompensieren, finde ich den Ansatz auch fragwürdig.
 

Zurück
Oben