sql >> Databasteknik >  >> RDS >> Mysql

SQL uppdatera en beräknad kolumn

Ditt problem är att du inte beräknar någon marktwert värde för spelare (Spieler) som är äldre än 31 år (geburtstag =födelsedag). Din UPDATE-sats försöker skriva NULL till marktwert kolumn, som definieras som NOT NULL . Och det resulterar i ett fel.

Lösningar:

1) Användare ELSE i ditt CASE och ange ett standardvärde:

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) Tillåt NULL värde för kolumnen marktwert :

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

3) Använd en WHERE skick:

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;

Uppdatering:Du kan också ta bort marktwert kolumn och använd en vy (beräknad tabell) istället:

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 ;

Uppdatering 2:

Om du använder MariaDB kan du också använda Virtuella (beräknade) kolumner




  1. Java SQL FEL:Relationstabellnamn finns inte

  2. Vilolägesproblem:måste visas i GROUP BY-satsen eller användas i en aggregerad funktion

  3. Hur man väljer en sträng mellan två strängar i en kolumn i SQL Server?

  4. IF-syntaxfel