Mysql
 sql >> Database >  >> RDS >> Mysql

SQL aggiorna una colonna calcolata

Il tuo problema è che non calcoli alcun marktwert valore per i giocatori (Spieler) che hanno più di 31 anni (geburtstag =compleanno). La tua istruzione UPDATE sta tentando di scrivere NULL nel marktwert colonna, che è definita come NOT NULL . E questo si traduce in un errore.

Soluzioni:

1) Utente ELSE nel tuo CASE istruzione e impostare un valore predefinito:

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) Consenti NULL valore per la colonna marktwert :

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

3) Usa un WHERE condizione:

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;

Aggiornamento:puoi anche rimuovere il marktwert colonna e utilizzare una visualizzazione (tabella calcolata) invece:

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 ;

Aggiornamento 2:

Se usi MariaDB puoi anche usare Colonne virtuali (calcolate)