业务场景:

数据表中有一个update_time字段,设置为timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,使用模型中的update()或save()方法【以phalcon为例】,发现无法更新。

问题解析:

  1. 在数据库中更改数据,发现更新字段会更改,判定是代码中的问题。
  2. 使用sql原生语句,结果同上。
  3. 使用模型中的update()方法,发现不能更新。
public function test($field_name1,$field_name2){$model = LiveRoomBroadcast::findFirst(["conditions" => "field_name1=:field_name1: AND field_name2=:field_name2: AND is_delete=1","bind" => ["field_name1" => $field_name1,"field_name2" => $field_name2]]);$model->is_delete = 0;// $del_broadcast_model->update_time = null;$res = $model->update();
}
  1. 配置了sql跟踪后发现其语句为:
[Wed, 29 Dec 21 18:36:20 +0800][INFO]
SELECT `table_name`.`id`,`table_name`.`field_name1`, `table_name`.`end_time`, `table_name`.`field_name2`, `table_name`.`create_time`, `table_name`.`update_time`, `table_name`.`is_delete`
FROM `table_name`
WHERE `table_name`.`field_name1` = :field_name1
AND `table_name`.`field_name2` = :field_name2
LIMIT :APL0
[Wed, 29 Dec 21 18:36:20 +0800][INFO]
UPDATE `table_name`
SET `field_name1` = ?, `end_time` = null, `field_name2` = ?, `create_time` = ?, `update_time` = ?, `is_delete` = ?
WHERE `id` = ?
  1. 从此处可以看到,取出模型对象的时候,将该条数据的所有信息都取出来,而且在update的时候将所有的值都赋给update()方法,导致数据库中的update_time字段仍然为过去的时间。

解决方法:

第一种:在模型中设置动态更新

use Phalcon\Mvc\Model;class Robots extends Model
{public function initialize(){$this->useDynamicUpdate(true);}
}

再查看sql语句,已经变成

[Thu, 30 Dec 21 09:15:32 +0800][INFO]
SELECT      `table_name`.`id`, `table_name`.`field_name1`, `table_name`.`end_time`, `table_name`.`field_name2`, `table_name`.`create_time`, `table_name`.`update_time`, `table_name`.`is_delete`
FROM `table_name`
WHERE `table_name`.`field_name1` = :field_name1
AND `table_name`.`field_name2` = :field_name2
AND `table_name`.`is_delete` = 1
LIMIT :APL0
[Thu, 30 Dec 21 09:15:32 +0800][INFO]
UPDATE `table_name`
SET `is_delete` = ?
WHERE `id` = ?

第二种: 更新的时候设置update_time字段,此种方法只能在更新的时候用,而且当使用框架封装的软删除仍然会出现问题。

public function test($field_name1,$field_name2){$model = LiveRoomBroadcast::findFirst(["conditions" => "field_name1=:field_name1: AND field_name2=:field_name2: AND is_delete=1","bind" => ["field_name1" => $field_name1,"field_name2" => $field_name2]]);$model->is_delete = 0;$model->update_time = null;//数据库中不能为空,会自动填入//$model->update_time = time();直接设置时间$res = $model->update();

以上为学习笔记,若有误请指教。

神奇的bug之DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP自动更新失败相关推荐

  1. MySQL:让表的时间字段在insert和update时自动更新

    让字段自动更新为当前时间戳: --insert时若不指定updated值,则插入当前时间 CREATE TABLE `test_update` (`id` int(32) NOT NULL,`upda ...

  2. 计算机策略更新失败怎么办,Win10系统自动更新失败 步骤 1、首先要停止Windows update服务...

    Win10自动更新安装失败怎么办?自从Win 10推出以来,有不少小伙伴也是立马更新了,而且Win10作为微软力推之作,后续更新力度也是不容小觑,却有用户在自动更新的时候发现,安装失败了.要怎么解决这 ...

  3. 取消MySQL timestamp列默认ON UPDATE CURRENT_TIMESTAMP

    参考:http://blog.csdn.net/zht666/article/details/10373923 mysql授权用户: grant all on *.* to root@'%' iden ...

  4. MySQL--timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性

    1.TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP      在创建新记录和修改现有记录的时候都对这个数据列刷新 2.T ...

  5. postgresql兼容MySQL on update current_timestamp

    问题描述 PostgreSQL执行Insert语句时,自动填入时间的功能可以在创建表时实现,但更新表时时间戳不会自动自动更新. 在mysql中可以在创建表时定义自动更新字段,比如 : create t ...

  6. MySQL 设置和取消“ON UPDATE CURRENT_TIMESTAMP”

    文章目录 1. 设置"ON UPDATE CURRENT_TIMESTAMP" 2. 取消"ON UPDATE CURRENT_TIMESTAMP" 1. 设置 ...

  7. Mysql使用on update current_timestamp

    Mysql使用on update current_timestamp注意点 最近项目里时间字段(datetime,timestamp)用到了ON UPDATE CURRENT_TIMESTAMP属性, ...

  8. MySQL函数:ON UPDATE CURRENT_TIMESTAMP 与 CURRENT_TIMESTAMP

    日常开发总结:MySQL函数:ON UPDATE CURRENT_TIMESTAMP 与 CURRENT_TIMESTAMP 如表的创建语句:重点在于updated_time字段的函数 create ...

  9. 创建mysql的表怎么显示00_Mysql sql_mode设置 timestamp default 0000-00-00 00:00:00 创建表失败处理...

    往数据库里创建新表的时候报错: [Err] 1067 - Invalid default value for 'updateTime' DROP TABLE IF EXISTS `passwd_res ...

最新文章

  1. 【论文速读】城市自动驾驶应用的概率语义地图
  2. 模板建站和开发网站区别_湖南网站建设定制网站和模板建站的区别
  3. android 6.0 sd卡读写权限,Android 6.0 读写SD卡权限问题
  4. android 定时打电话教程
  5. c#使用System.Windows.Forms.DataVisualization.Charting.dll绘制图表实例
  6. 深解微服务架构:从过去,到未来
  7. nginx和tomcat实现反向代理、负载均衡和session共享
  8. bzoj 1642: [Usaco2007 Nov]Milking Time 挤奶时间(DP)
  9. [FPGA] 三位四选一数据选择器
  10. 位图图片转换矢量图的工具:Vector Magic for mac
  11. AntD 的 Descriptions 组件实现“ 右对齐效果 ”
  12. rhel6.5 oracle12c,中标麒麟Linux6.5安装Oracle12C配置过程
  13. 树莓派 + AWS IoT Greengrass
  14. 使用ul li 实现图片的左右滚动
  15. 单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)
  16. 计算s=1+1/2+1/3+…+1/n。当n足够大s>k,求n
  17. 还在苦恼怎么学PS、编程?这五个自学网站免费教!年薪百万不是梦
  18. 有关于毕业论文提纲范文
  19. 极验验证简介(待续)
  20. 用Maven手写SpringIOC(简易版)

热门文章

  1. 哪吒前端周刊 | 第001期
  2. java 截取mp3/aac
  3. 网络游戏开发-基本设计
  4. 《图解HTTP》学习
  5. mysql复制多行_mysql中的复制方式总结(半同步复制,并行复制,多源复制)
  6. collect的几种形式_Java中的collection集合类型总结
  7. 欧盟加密监管法案通过,美国急了?
  8. 值得一看的35个Redis常用问题总结
  9. 基于php的公交查询系统研究与实现,基于PHP的公交查询系统研究与实现
  10. ARM A系列处理器对比