Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL met à jour une colonne calculée

Votre problème est que vous ne calculez aucun marktwert valeur pour les joueurs (Spieler) âgés de plus de 31 ans (geburtstag =anniversaire). Votre instruction UPDATE essaie d'écrire NULL dans le marktwert colonne, qui est définie comme NOT NULL . Et cela se traduit par une erreur.

Solution :

1) Utilisateur ELSE dans votre CASE et définissez une valeur par défaut :

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) Autoriser NULL valeur pour la colonne marktwert :

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

3) Utilisez un WHERE condition :

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;

Mise à jour :Vous pouvez également supprimer le marktwert colonne et utilisez une vue (table calculée) à la place :

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 ;

Mise à jour 2 :

Si vous utilisez MariaDB, vous pouvez également utiliser Colonnes virtuelles (calculées)