动态更新数据库列

时间:2013-08-06 15:18:48

标签: php mysql

mysql> describe break;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| start       | datetime | YES  |     | NULL    |                |
| end         | datetime | YES  |     | NULL    |                |
| duration    | datetime | YES  |     | NULL    |                |
| date        | datetime | YES  |     | NULL    |                |
| employee_id | int(11)  | NO   | MUL | NULL    |                |
+-------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

我想使用上表中的起始值和结束值计算(并更新)'duration'列。例如:

UPDATE break SET duration=TIMEDIFF(start, end) WHERE employee_id=1;

唉,这会将duration列设置为0000-00-00 00:00:00

mysql> select * from break\G;
*************************** 1. row ***************************
     id: 30
  start: 2013-08-06 15:43:17
    end: 2013-08-06 15:55:42
duration: 0000-00-00 00:00:00
   date: 2013-08-06 15:43:17
employee_id: 1
1 row in set (0.00 sec)

帮助

2 个答案:

答案 0 :(得分:4)

来自documentation(强调我的):

  

TIMEDIFF()返回expr1 - expr2,表示为时间值

duration更改为TIME类型,它应该有效。

请注意,您正在架构中创建冗余。这通常是一件坏事。如果endstart发生更改且您未更新duration该怎么办?更好地使用视图并返回从TIMEDIFFend计算的start

答案 1 :(得分:2)

durration更改为TIME,然后更新您的代码

UPDATE break SET duration=TIMEDIFF(end, start) WHERE employee_id=1;

或者你会得到负面的刺激

更新:在回答另一个答案时,您可以设置一个触发器,每次更新行时设置持续时间

DROP TRIGGER IF EXISTS `break_trigger`;
DELIMITER //
CREATE TRIGGER `break_trigger` AFTER UPDATE ON `break`
 FOR EACH ROW BEGIN
    SET duration=TIMEDIFF(end, start) WHERE employee_id= NEW.employee_id;
END
//
DELIMITER ;