我在sql中使用INSERT ... SELECT FROM
语句插入空日期
CREATE TABLE null_date (
id bigserial PRIMARY KEY
, some_date date
);
WITH date_data (some_date) AS (
VALUES (null)
)
INSERT INTO null_date (some_date)
SELECT some_date
FROM date_data;
它失败了
ERROR: column "some_date" is of type date but expression is of type text
LINE 5: SELECT some_date
^
HINT: You will need to rewrite or cast the expression.
但是,如果我尝试直接插入它,它的工作
INSERT INTO null_date (some_date)
VALUES (null)
有人能帮我理解这里发生了什么吗?这是db<>fiddle的链接。谢谢
1条答案
按热度按时间7jmck4yq1#
问题是
VALUES
语句和WITH
子句会将NULL值作为text
类型处理,因为PostgreSQL不知道NULL值应该是哪种数据类型,而INSERT INTO ... VALUES (...)
就没有这个问题,因为PostgreSQL知道unknown
类型的NULL值会被插入到某个列中。因此它会将其解析为目标数据类型。在PostgreSQL无法从上下文猜测数据类型的情况下,最好使用显式类型转换:
PostgreSQL过去在这种情况下的行为有所不同,但commit 1e7c4bb0049在2017年改变了这一点。阅读提交消息以了解解释。