PostgreSQL执行INSERT报错:birthdate是timestamp类型但表达式为text
问题原因
你触发报错的核心原因是INSERT语句指定的插入列顺序和SELECT子句返回的列顺序完全错位,导致值的类型和目标列不匹配:
- 你声明的插入列顺序为
(name,gender,birthDate,userId) - 但
SELECT返回的列顺序依次是userId、name、gender、birthDate - 错位后,原本属于
gender字段的文本类型值被匹配到了birthDate的插入位置,就触发了「文本类型无法匹配timestamp类型」的报错。
修复方案
只需要调整SELECT子句的列顺序,和插入列的顺序对应即可,修改后的语句如下:
INSERT INTO profile.profile(name,gender,birthDate,userId) SELECT substr(md5(random()::text), 0, 5) AS name, substr(md5(random()::text), 0, 2) AS gender, to_timestamp('2021-08-09 13:57:40', 'YYYY-MM-DD hh24:mi:ss') AS birthDate, userId FROM generate_series(1,10) AS y(userId)
补充注意
PostgreSQL默认会将未加双引号的标识符自动转为全小写,如果你需要保留列名的大小写格式,建表和操作时需要给列名包裹双引号,比如"birthDate"。本次报错和大小写无关,不需要修改建表语句。
内容的提问来源于stack exchange,提问作者Mistral
相关产品推荐
相关产品推荐

