Twój problem polega na tym, że nie obliczasz żadnego marktwert
wartość dla graczy (Spieler), którzy mają więcej niż 31 lat (geburtstag =urodziny). Twoja instrukcja UPDATE próbuje napisać NULL
w marktwert
kolumna, która jest zdefiniowana jako NOT NULL
. A to skutkuje błędem.
Rozwiązania:
1) Użytkownik ELSE
w Twoim CASE
oświadczenie i ustaw wartość domyślną:
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) Zezwól na NULL
wartość dla kolumny marktwert
:
CREATE TABLE `_spieler` (
...
`marktwert` int(10) NULL DEFAULT '0',
...
)
3) Użyj WHERE
warunek:
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;
Aktualizacja:możesz również usunąć marktwert
i użyj widoku
(tabela obliczeniowa) zamiast:
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 ;
Aktualizacja 2:
Jeśli korzystasz z MariaDB, możesz również użyć wirtualnych (obliczonych) kolumn