sql >> Database >  >> RDS >> Mysql

SQL update een berekende kolom

Uw probleem is dat u geen marktwert . berekent waarde voor spelers (Spieler) die ouder zijn dan 31 jaar (geburtstag =verjaardag). Uw UPDATE-instructie probeert NULL te schrijven in de marktwert kolom, die is gedefinieerd als NOT NULL . En dat resulteert in een fout.

Oplossingen:

1) Gebruiker ELSE in uw CASE statement en stel een standaardwaarde in:

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) Sta NULL toe waarde voor kolom marktwert :

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

3) Gebruik een WHERE staat:

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;

Update:je kunt ook de marktwert . verwijderen kolom en gebruik een weergave (berekende tabel) in plaats daarvan:

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 ;

Update 2:

Als u MariaDB gebruikt, kunt u ook Virtual (Computed) Columns




  1. Innerlijke join &outer join; is de volgorde van tabellen in van belangrijk?

  2. Typ datum standaard sysdate in Mysql

  3. Hoe vergelijk ik twee kolommen in SQL?

  4. Hoe de verbinding van cassandra met pentaho data integrator te controleren?