При использовании инструкции COPY FROM получение ОШИБКИ: нулевое значение в столбце field_id нарушает ограничение ненулевого значения

Я использую команду 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, файл содержит 3 значения в 1 строке.

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, и это сработало.

Я не понимаю, почему это не работает с исходным определением таблицы.


person Ilanit Nulman    schedule 23.08.2018    source источник
comment
Проблема в том, что при вставке строк он устанавливает значение всех не в списке в NULL... а в поле GENERATED BY DEFAULT AS IDENTITY должно быть DEFAULT, а не NULL... так что вы в принципе не можете сделать это таким образом.   -  person Flash Thunder    schedule 23.08.2018


Ответы (1)


Проблема в том, что вы указали, что field_id не является нулевым значением, и, следовательно, когда файл передает значение null в качестве значения, ваша ошибка присутствует. Если вам нужен идентификатор автоматического увеличения, используйте,

 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.

person Shivam Batra    schedule 24.08.2018
comment
CONTEXT: COPY app2dbmap, line 1: "'aaa','bbb','ccc'" Файл не передает нулевое значение. В файле всего три столбца: имя_поля, имя_таблицы и имя_столбца. - person Adrian Martin; 12.09.2018
comment
Когда вы не передаете значение, оно по умолчанию принимает null , есть 4 столбца, и если 3 из них указаны, четвертый автоматически будет нулевым, а не нулевой предотвратит вставку нулевых значений. - person Shivam Batra; 13.09.2018