神奇的bug之DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP自动更新失败
业务场景:
数据表中有一个update_time字段,设置为timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,使用模型中的update()或save()方法【以phalcon为例】,发现无法更新。
问题解析:
- 在数据库中更改数据,发现更新字段会更改,判定是代码中的问题。
- 使用sql原生语句,结果同上。
- 使用模型中的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();
}
- 配置了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` = ?
- 从此处可以看到,取出模型对象的时候,将该条数据的所有信息都取出来,而且在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自动更新失败相关推荐
- MySQL:让表的时间字段在insert和update时自动更新
让字段自动更新为当前时间戳: --insert时若不指定updated值,则插入当前时间 CREATE TABLE `test_update` (`id` int(32) NOT NULL,`upda ...
- 计算机策略更新失败怎么办,Win10系统自动更新失败 步骤 1、首先要停止Windows update服务...
Win10自动更新安装失败怎么办?自从Win 10推出以来,有不少小伙伴也是立马更新了,而且Win10作为微软力推之作,后续更新力度也是不容小觑,却有用户在自动更新的时候发现,安装失败了.要怎么解决这 ...
- 取消MySQL timestamp列默认ON UPDATE CURRENT_TIMESTAMP
参考:http://blog.csdn.net/zht666/article/details/10373923 mysql授权用户: grant all on *.* to root@'%' iden ...
- MySQL--timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
1.TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这个数据列刷新 2.T ...
- postgresql兼容MySQL on update current_timestamp
问题描述 PostgreSQL执行Insert语句时,自动填入时间的功能可以在创建表时实现,但更新表时时间戳不会自动自动更新. 在mysql中可以在创建表时定义自动更新字段,比如 : create t ...
- MySQL 设置和取消“ON UPDATE CURRENT_TIMESTAMP”
文章目录 1. 设置"ON UPDATE CURRENT_TIMESTAMP" 2. 取消"ON UPDATE CURRENT_TIMESTAMP" 1. 设置 ...
- Mysql使用on update current_timestamp
Mysql使用on update current_timestamp注意点 最近项目里时间字段(datetime,timestamp)用到了ON UPDATE CURRENT_TIMESTAMP属性, ...
- MySQL函数:ON UPDATE CURRENT_TIMESTAMP 与 CURRENT_TIMESTAMP
日常开发总结:MySQL函数:ON UPDATE CURRENT_TIMESTAMP 与 CURRENT_TIMESTAMP 如表的创建语句:重点在于updated_time字段的函数 create ...
- 创建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 ...
最新文章
- 【论文速读】城市自动驾驶应用的概率语义地图
- 模板建站和开发网站区别_湖南网站建设定制网站和模板建站的区别
- android 6.0 sd卡读写权限,Android 6.0 读写SD卡权限问题
- android 定时打电话教程
- c#使用System.Windows.Forms.DataVisualization.Charting.dll绘制图表实例
- 深解微服务架构:从过去,到未来
- nginx和tomcat实现反向代理、负载均衡和session共享
- bzoj 1642: [Usaco2007 Nov]Milking Time 挤奶时间(DP)
- [FPGA] 三位四选一数据选择器
- 位图图片转换矢量图的工具:Vector Magic for mac
- AntD 的 Descriptions 组件实现“ 右对齐效果 ”
- rhel6.5 oracle12c,中标麒麟Linux6.5安装Oracle12C配置过程
- 树莓派 + AWS IoT Greengrass
- 使用ul li 实现图片的左右滚动
- 单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)
- 计算s=1+1/2+1/3+…+1/n。当n足够大s>k,求n
- 还在苦恼怎么学PS、编程?这五个自学网站免费教!年薪百万不是梦
- 有关于毕业论文提纲范文
- 极验验证简介(待续)
- 用Maven手写SpringIOC(简易版)