PostgreSQL COPY命令导入时如何区分空字符串与NULL值
问题原因
你用的是COPY默认的TEXT解析格式,这个格式里双引号只是普通字符,不会被识别为字段值的包裹标记,也没法通过写法区分空字符串和NULL,才会导致你传的""被误判成NULL,触发非空约束报错。
正确配置方案
要实现""解析为空字符串、无内容的空字段解析为NULL的效果,需要切换到CSV解析模式并显式指定匹配规则,修改后的COPY命令如下:
COPY test_table (id, col1, col2) FROM stdin WITH ( FORMAT CSV, DELIMITER ',', QUOTE '"', NULL '' );
参数说明
FORMAT CSV:开启CSV解析模式,这个模式支持用引用符包裹字段值,原生支持区分被包裹的实际值和空值DELIMITER ',':指定逗号为字段分隔符,和你之前的配置一致QUOTE '"':指定双引号作为字段引用符,所有被双引号包起来的内容都会按实际字符串解析,不会被识别成NULLNULL '':规则是没被引用符包着的空内容(也就是两个逗号中间啥都没有的,,形式)才会被解析为NULL;被双引号包着的空内容""会被识别成长度为0的空字符串,正好符合你的需求。
注意事项
你原来写的测试数据里""前面多了个空格,这个空格会被算成字段值的一部分,最后col1解析出来会是 ""(一个空格加两个双引号),如果要拿到纯空字符串,要把字段前后多余的空格删掉,正确的输入数据写法是:
1,"",, 2,"",,
用上面的配置执行,id会拿到1、2,col1是空字符串,col2是NULL,不会再报非空约束的错误。
内容的提问来源于stack exchange,提问作者pikk
相关产品推荐
相关产品推荐

