Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL atualiza uma coluna calculada


Seu problema é que você não calcula nenhum marktwert valor para jogadores (Spieler) com mais de 31 anos (geburtstag =aniversário). Sua instrução UPDATE está tentando escrever NULL no marktwert coluna, que é definida como NOT NULL . E isso resulta em um erro.

Soluções:

1) Usuário ELSE em seu CASE declaração e defina um valor padrão:
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 a coluna marktwert :
CREATE TABLE `_spieler` (
  ...
  `marktwert` int(10) NULL DEFAULT '0',
  ...
)

3) Use um WHERE doença:
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;

Atualização:você também pode remover o marktwert coluna e use uma visualização (tabela calculada) em vez disso:
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 ;

Atualização 2:

Se você usa o MariaDB, também pode usar Colunas virtuais (computadas)