mysql - SQL update a calculated column -
i have column in table need update. column computed this:
select case when timestampdiff(year, geburtstag, now()) <= 27 ((w_staerke/100*70) + (w_technik/100*30)) when timestampdiff(year, geburtstag, now()) <= 31 ((w_staerke/100*70) + (w_technik/100*30)) end marktwert _spieler; i want update column on records table.
can use like
update _spieler set marktwert = case when timestampdiff(year, geburtstag, now()) <= 27 ((w_staerke/100*70) + (w_technik/100*30)) when timestampdiff(year, geburtstag, now()) <= 31 ((w_staerke/100*70) + (w_technik/100*30)) end; the query seems correct, sets value in "marktwert" 0 every row.
create table `_spieler` ( `id` int(10) not null, `vorname` varchar(30) default null, `nachname` varchar(30) default null, `geburtstag` date not null, `w_staerke` tinyint(3) not null, `w_technik` tinyint(3) not null, `marktwert` int(10) not null default '0', `age` tinyint(3) default null, ) engine=innodb default charset=utf8 auto_increment=535 ; (1, 'adam', 'federici', '1985-01-31', 30, 20, 0, null), (2, 'ryan', 'allsop', '1992-06-17', 20, 30, 0, null), (3, 'tyrone', 'mings', '1980-03-13', 40, 20, 0, null), (4, 'joe', 'bennett', '1990-03-28', 25, 30, 0, null), (5, 'charlie', 'daniels', '1986-09-07', 50, 30, 0, null); table definition , sample data
update _spieler set marktwert = case when timestampdiff(year, geburtstag, now()) <= 27 ((w_staerke/100*70) + (w_technik/100*30)) * 600000 when timestampdiff(year, geburtstag, now()) <= 31 (((w_staerke/100*70) + (w_technik/100*30)) * 600000) - 5000000 when timestampdiff(year, geburtstag, now()) > 31 (((w_staerke/100*70) + (w_technik/100*30)) * 600000) - 10000000 end final query added
your problem not calculate marktwert value players (spieler) older 31 years (geburtstag = birthday). update statement trying write null marktwert column, defined not null. , results in error.
solutions:
1) user else in case statement , set default value:
update _spieler set marktwert = case when timestampdiff(year, geburtstag, now()) <= 27 ((w_staerke/100*70) + (w_technik/100*30)) when timestampdiff(year, geburtstag, now()) <= 31 ((w_staerke/100*70) + (w_technik/100*30)) else 0 end; 2) allow null value column marktwert:
create table `_spieler` ( ... `marktwert` int(10) null default '0', ... ) 3) use where condition:
update _spieler set marktwert = case when timestampdiff(year, geburtstag, now()) <= 27 ((w_staerke/100*70) + (w_technik/100*30)) when timestampdiff(year, geburtstag, now()) <= 31 ((w_staerke/100*70) + (w_technik/100*30)) end timestampdiff(year, geburtstag, now()) <= 31; update: can remove marktwert column , use view (calculated table) instead:
create view `_spieler_view` select s.*, case when timestampdiff(year, geburtstag, now()) <= 27 ((w_staerke/100*70) + (w_technik/100*30)) when timestampdiff(year, geburtstag, now()) <= 31 ((w_staerke/100*70) + (w_technik/100*30)) end marktwert_calculated _spieler s ; update 2:
if use mariadb use virtual (computed) columns
Comments
Post a Comment