sql >> Base de Datos >  >> RDS >> Mysql

SQL actualiza una columna calculada

Tu problema es que no calculas ningún marktwert valor para jugadores (Spieler) mayores de 31 años (geburtstag =cumpleaños). Su instrucción UPDATE está intentando escribir NULL en el marktwert columna, que se define como NOT NULL . Y eso resulta en un error.

Soluciones:

1) Usuario ELSE en tu CASE declaración y establezca un valor predeterminado:

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) Permitir NULL valor para la columna marktwert :

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

3) Usa un WHERE condición:

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;

Actualización:también puede eliminar el marktwert y use una vista (tabla calculada) en su lugar:

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 ;

Actualización 2:

Si usa MariaDB, también podría usar Columnas virtuales (computadas)