Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL aktualisiert eine berechnete Spalte

Ihr Problem ist, dass Sie keinen marktwert berechnen Wert für Spieler, die älter als 31 Jahre sind (geburtstag =Geburtstag). Ihre UPDATE-Anweisung versucht, NULL zu schreiben in den marktwert Spalte, die als NOT NULL definiert ist . Und das führt zu einem Fehler.

Lösungen:

1) Benutzer ELSE in Ihrem CASE -Anweisung und legen Sie einen Standardwert fest:

UPDATE _spieler SET marktwert =     CASE 
        WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30))
        WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30))
        ELSE 0
    END;

2) NULL zulassen Wert für die Spalte marktwert :

CREATE TABLE `_spieler` (
  ...
  `marktwert` int(10) NULL DEFAULT '0',
  ...
)

3) Verwenden Sie ein WHERE Bedingung:

UPDATE _spieler SET marktwert =     CASE 
        WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30))
        WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30))
    END
WHERE TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31;

Update:Sie können den marktwert auch entfernen -Spalte und verwenden Sie eine Ansicht (berechnete Tabelle) statt:

CREATE VIEW `_spieler_view` AS SELECT s.*,
    CASE 
        WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30))
        WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30))
    END AS marktwert_calculated
from _spieler s ;

Aktualisierung 2:

Wenn Sie MariaDB verwenden, können Sie auch virtuelle (berechnete) Spalten