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

SQL opdatere en beregnet kolonne

Dit problem er, at du ikke beregner nogen marktwert værdi for spillere (Spieler), der er ældre end 31 år (geburtstag =fødselsdag). Din UPDATE-sætning forsøger at skrive NULL ind i marktwert kolonne, som er defineret som NOT NULL . Og det resulterer i en fejl.

Løsninger:

1) Bruger ELSE i din CASE sætning og indstil en standardværdi:

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) Tillad NULL værdi for kolonne marktwert :

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

3) Brug en WHERE tilstand:

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;

Opdatering:Du kan også fjerne marktwert kolonne og brug en visning (beregnet tabel) i stedet:

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 ;

Opdatering 2:

Hvis du bruger MariaDB kan du også bruge Virtuelle (beregnet) kolonner




  1. Eksporter et CREATE-script til en database

  2. Java-Eclipse:Pakken oracle.jdbc.driver findes ikke

  3. Indsæt dato og tid i Mysql

  4. Indlæs Postgres-dump efter docker-compose up