无法在pgAdmin 4中导入CSV文件。

3
我将通过pgAdmin 4将数据CSV导入到PostgreSQL。但是,出现了问题。
ERROR: invalid input syntax for type integer: ""
CONTEXT: COPY films, line 1, column gross: ""

我了解关于错误的信息,第一行第gross列存在空值,在其他列中也存在空值。我的问题是,如果导入的csv文件中存在空值该怎么办?我已经在谷歌上搜索过,但没有找到类似的情况。

CREATE TABLE public.films
(
    id int,
    title varchar,
    release_year float4,
    country varchar,
    duration float4,
    language varchar,
    certification varchar,
    gross int,
    budget int
);

我尝试使用以下代码,但失败了

CREATE TABLE public.films
(
    id int,
    title varchar,
    release_year float4 null,
    country varchar null,
    duration float4 null,
    language varchar null,
    certification varchar null,
    gross float4 null,
    budget float4 null
);

图片中的错误信息

我在谷歌和stackoverflow论坛上搜索了很久,希望有人能够帮助我解决问题。


工具->导入/导出,你试过了吗?https://learnsql.com/blog/how-to-import-csv-to-postgresql/ - Kas
是的,我已经尝试过这个教程了。如果你能帮我,你可以访问我的数据,链接为https://drive.google.com/drive/folders/1Jnewe29ZDJzyxH6XlnzLt4prvnoR11KY?usp=sharing。如果你成功了,请不要忘记告诉我。 - linggapratama28
我会试一下。作为一个快速解决方案,我可以推荐不同的IDE - Dbeaver(社区版是免费的),我从来没有在那里导入csv文件出现过问题。 - Kas
我有相同的错误 - 这是因为 gross 列中的第一个值为 NULL,但从技术上讲这不应该影响... 我认为。 - Kas
感谢您的参与和帮助。希望其他朋友也能帮忙解决我遇到的问题。 - linggapratama28
2个回答

1
  1. 这两个表定义没有区别。默认情况下,列接受 NULL

  2. 问题不在于 NULL 值,而是空字符串:

select ''::integer;
ERROR:  invalid input syntax for type integer: ""
LINE 1: select ''::integer;

select null::integer;
 int4 
------
 NULL

创建一个暂存表,以varchar数据类型存储现在是integer的字段。将数据加载到该表中。然后使用类似以下这样的内容修改空字符串数据,使其成为integer
update table set gross = nullif(trim(gross), '');

然后将数据移动到生产表中。

这不是pgAdmin4的问题,而是数据问题。在psql中工作更容易跟踪:

CREATE TABLE public.films_text
(
    id varchar,
    title varchar,
    release_year varchar,
    country varchar,
    duration varchar,
    language varchar,
    certification varchar,
    gross varchar,
    budget varchar
);
\copy films_text from '~/Downloads/films.csv' with csv
COPY 4968

CREATE TABLE public.films
(
    id int,
    title varchar,
    release_year float4,
    country varchar,
    duration float4,
    language varchar,
    certification varchar,
    gross int,
    budget int
);
-- Below done because of this value 12215500000 in budget column
alter table films alter COLUMN budget type int8;

INSERT INTO films
SELECT
    id::int,
    title,
    nullif (trim(release_year), '')::real, country, nullif(trim(duration), '')::real,
    LANGUAGE,
    certification,
    nullif (trim(gross), '')::float, nullif(trim(budget), '')::float
FROM
    films_text;

INSERT 0 4968



谢谢兄弟。虽然你的代码与我的解决方案不匹配,但它为我解决问题提供了广阔的空间。 - linggapratama28
我不知道那是什么意思。问题在于您正在尝试将空字符串作为“整数”加载,这是行不通的。 - Adrian Klaver
希望您尝试使用此数据集:https://drive.google.com/drive/u/1/folders/1Jnewe29ZDJzyxH6XlnzLt4prvnoR11KY,然后尝试在pgadmin4中导入它。如果出现错误 (ERROR: invalid input syntax for type integer: "" CONTEXT: COPY films, line 1, column gross: "") 并且您找到了解决方案,请告诉我。因为我有包含空值的数据,但无法导入pgadmin4,而且错误与上述情况差不多。感谢您的帮助。 - linggapratama28
更新的答案,附带我如何加载数据的示例。数据存在多个需要处理的问题。 - Adrian Klaver

1

这对我有用: https://learnsql.com/blog/how-to-import-csv-to-postgresql/

一个小的解决方法,但它有效

  1. 我创建了一个表
  2. 我在csv文件中添加了标题
  3. 右键单击新创建的表->导入/导出数据,选择要上传的csv文件,转到选项卡2-选择标题,然后它应该可以工作

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接