使用COPY FROM语句时出现错误:列“ field_id”中的空值违反了非空约束

时间:2018-08-23 10:22:49

标签: postgresql postgresql-10

我正在使用COPY FROM命令从文件中加载数据。 该表用标识列定义,该列不属于文件。

CREATE TABLE APP2DBMAP ( 
    FIELD_ID             integer  NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    FIELD_NAME           varchar(128)   ,
    TABLE_NAME           varchar(128)   ,
    COLUMN_NAME          varchar(128)   ,
    CONSTRAINT PK_APP2DBMAP PRIMARY KEY ( FIELD_ID )
);

我执行了以下COPY FROM命令,该文件在1行中包含3个值。

copy app2dbmap (field_name, table_name, column_name) from '/opt/NetMgr/data/templ_db.txt' DELIMITER ',' ;

我收到以下错误:

ERROR:  null value in column "field_id" violates not-null constraint
DETAIL:  Failing row contains (null, 'aaa', 'bbb', 'ccc').
CONTEXT:  COPY app2dbmap, line 1: "'aaa','bbb','ccc'"

我尝试将field_id的列描述更改为serial,并且确实可以正常工作。

我不明白为什么它不适用于原始表定义。

1 个答案:

答案 0 :(得分:-1)

问题是您已将field_id指定为非null值,因此当文件将null作为值传递时,就会出现错误。 如果您想要一个自动增量ID,请使用

 CREATE TABLE APP2DBMAP ( 
FIELD_ID             smallserial  NOT NULL,
FIELD_NAME           varchar(128)   ,
TABLE_NAME           varchar(128)   ,
COLUMN_NAME          varchar(128)   ,
CONSTRAINT PK_APP2DBMAP PRIMARY KEY ( FIELD_ID )
);

您也可以使用bigserial(int4)代替smallint(int8)

或者您可以提供默认值

CREATE TABLE APP2DBMAP ( 
FIELD_ID             integer NOT NULL default 0,
FIELD_NAME           varchar(128)   ,
TABLE_NAME           varchar(128)   ,
COLUMN_NAME          varchar(128)   ,
CONSTRAINT PK_APP2DBMAP PRIMARY KEY ( FIELD_ID )
);

您将必须传递一些东西,不能在非null列中传递null