Vấn đề của bạn là bạn không tính toán bất kỳ marktwert
nào giá trị cho người chơi (Spieler) trên 31 tuổi (geburtstag =ngày sinh). Câu lệnh UPDATE của bạn đang cố viết NULL
vào marktwert
, được định nghĩa là NOT NULL
. Và điều đó dẫn đến lỗi.
Giải pháp:
1) Người dùng ELSE
trong CASE
của bạn và đặt giá trị mặc định:
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) Cho phép NULL
giá trị cho cột marktwert
:
CREATE TABLE `_spieler` (
...
`marktwert` int(10) NULL DEFAULT '0',
...
)
3) Sử dụng WHERE
điều kiện:
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;
Cập nhật:Bạn cũng có thể xóa marktwert
và sử dụng chế độ xem
(bảng được tính toán) thay vào đó:
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 ;
Cập nhật 2:
Nếu bạn sử dụng MariaDB, bạn cũng có thể sử dụng Cột ảo (Tính toán)