INSERT INTO SELECT复制表数据时如何将ctime字段设为NOW()
单条SQL实现复制数据并自动写入插入时间的方案
你原写法用SELECT *会直接把table1存储的旧ctime值带过去,没法生成插入时刻的新时间,只要调整查询逻辑,显式替换ctime字段的取值即可,不需要额外操作。
通用推荐写法(兼容所有主流关系型数据库,生产环境可用)
最稳妥的方式是显式指定插入字段和查询字段,完全避免表结构变动导致的字段错位、值不匹配问题,在查询列表对应ctime的位置直接写NOW()即可:
INSERT INTO table2 (col1, col2, col3, ctime) SELECT col1, col2, col3, NOW() FROM table1 WHERE identifier = %s
你需要把示例里的
col1/col2/col3替换成两个表中除ctime外的实际业务字段,SELECT后面的字段顺序要和INSERT INTO后括号里的字段顺序完全对应。
由于table2不存在唯一行标识,不需要处理唯一键冲突逻辑,语句直接执行即可。同一条SQL插入的所有记录ctime值完全一致,都是SQL执行时刻的当前时间。
非推荐偷懒写法(仅适用特定场景,不建议生产环境使用)
如果你的场景同时满足以下前提,可以简化字段书写:
- table1和table2的字段顺序、字段类型完全一致
- ctime是table2独有的字段,table1中不存在ctime列,且ctime是table2的最后一个字段
可以直接用如下写法:
INSERT INTO table2 SELECT *, NOW() FROM table1 WHERE identifier = %s
注意:只要table1后续加字段、或者ctime不是table2最后一个字段,这个写法就会直接报错或者写入错误值,仅适合临时取数场景使用。
内容的提问来源于stack exchange,提问作者user1775164
相关产品推荐
相关产品推荐

