SQL更新计算列

时间:2016-04-19 18:06:29

标签: mysql sql

我在表格中有一列需要更新。该列的计算方式如下:

SELECT 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
FROM _spieler;

我想更新该表中所有记录的列。

我可以使用

之类的东西
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;

查询似乎是正确的,但是它设置了&#34; marktwert&#34;每行为零。

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);

表定义和一些示例数据

UPDATE _spieler 
SET marktwert = CASE WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) * 600000 
WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN (((w_staerke/100*70) + (w_technik/100*30)) * 600000) - 5000000 
WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) > 31 THEN (((w_staerke/100*70) + (w_technik/100*30)) * 600000) - 10000000 END

添加了最终查询

1 个答案:

答案 0 :(得分:1)

您的问题是,您不会计算超过31年(geburtstag =生日)的玩家(Spieler)的任何marktwert值。您的UPDATE语句正在尝试将NULL写入marktwert列,该列定义为NOT NULL。这会导致错误。

解决方案:

1)ELSE语句中的用户CASE并设置默认值:

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)允许列NULL的{​​{1}}值:

marktwert

3)使用CREATE TABLE `_spieler` ( ... `marktwert` int(10) NULL DEFAULT '0', ... ) 条件:

WHERE

更新:您还可以删除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; 列,然后使用view(计算表格):

marktwert

更新2:

如果您使用MariaDB,您还可以使用Virtual (Computed) Columns