开发者社区> 问答> 正文

Timestamp 或 datetime 类型更新咨询

基于canal 1.1.0 版本。目前更新操作的实现通过调用rowData.getBeforeColumnsList 获取更新前的数据,再调用rowData.getAfterColumnsList 获取更新后的数据。先删除更新前的数据, 再插入更新后的数据,并保证这两个操作是原子性的,以达到更新的目的。

这种更新操作方式,在Delete 语句中,形成了delete from t1 where a1 = v1 and a2 = 'v2'....的SQL语句。 即where 条件中将所有列进行等值比较,并以and条件连接,以准确匹配到一行进行删除。但是当表中有datetime 类型或者 timestamp 类型的时候, 通过canal 解析得到的是时间类型字符串,如‘2018-11-29 09:41:00’。在Delete 语句中时间类型进行等值比较时会报varchar 和timestamp 不匹配,从而导致无法删除,从而更新失败。

请问针对这种情况,通用的解决的方法是怎样的呢? 谢谢。

原提问者GitHub用户jkl0898

展开
收起
古拉古拉 2023-05-08 17:12:40 122 0
2 条回答
写回答
取消 提交回答
  • delete的where条件只带着主键

    原回答者GitHub用户agapple

    2023-05-09 18:39:59
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    对于datetime和timestamp类型的数据,可以使用对应的时间戳(如unix时间戳)进行比较,而不是直接比较字符串。也可以使用数据库提供的日期时间函数进行比较,如MySQL中的DATE_FORMAT函数。另外,可以在canal的配置中设置将datetime和timestamp类型解析为Java的Date类型,这样可以方便地进行比较和操作。

    2023-05-08 17:29:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载