sql >> Databáze >  >> RDS >> Mysql

SQL aktualizuje vypočítaný sloupec

Váš problém je v tom, že nepočítáte žádný marktwert hodnota pro hráče (Spieler), kteří jsou starší 31 let (geburtstag =narozeniny). Váš příkaz UPDATE se pokouší zapsat NULL do marktwert sloupec, který je definován jako NOT NULL . A to má za následek chybu.

Řešení:

1) Uživatel ELSE ve vašem CASE a nastavte výchozí hodnotu:

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) Povolte NULL hodnotu pro sloupec marktwert :

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

3) Použijte WHERE podmínka:

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;

Aktualizace:Můžete také odstranit marktwert a použijte zobrazení (vypočítaná tabulka) místo:

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 ;

Aktualizace 2:

Pokud používáte MariaDB, můžete také použít Virtuální (počítané) sloupce




  1. UTF - 8 s JPA a Glassfish 4.0

  2. Kombinujte více jedinečných tabulek MySQL a uspořádejte je podle jednoho sloupce

  3. Použití sady výsledků SELECT ke spuštění dotazu UPDATE s uloženými procedurami MySQL

  4. Android Studio nekontroluje/nezvýrazní dotazy Kotlin Room DAO, když řetězec zabírá více než 1 řádek