2016-04-09 4 views
0

У меня есть две таблицы А (идентификатор, col1, col2) и B (col3, COL4, col5, col6)POSTGRESQL: INSERT INTO ... SELECT с автоматическим генерируемый столбец

столбец "Идентификатор" в таблице A это автоматический сгенерированный, а не нулевой первичный ключ.

Чтобы вставить данные из таблицы B в таблице А, я пытаюсь

INSERT INTO A(col1, col2) 
(SELECT col3, col4 from B) 

Это утверждение бросает ошибка

ERROR: null value in column "id" violates not-null constraint 
DETAIL: Failing row contains (null, "abc", "def") 

Я также попытался

INSERT INTO A(id, col1, col2) 
(SELECT DEFAULT, col3, col4 from B) 

это бросает ошибку

ERROR: syntax error at or near "DEFAULT" 

Почему postgres не генерирует автоматически значение для столбца «id»? Запрос работает, если я предоставляю «id» из таблицы B или если я вставляю одну строку (без выбора) и предоставляю ключевое слово «DEFAULT» для автоматически созданного столбца.

EDIT: создание таблицы запроса

CREATE TABLE A 
(
id bigint NOT NULL, 
col1 character varying(10), 
col2 character varying(10), 
CONSTRAINT A_pk PRIMARY KEY (id) 
); 
ALTER TABLE A OWNER TO user1; 

CREATE SEQUENCE A_id_seq 
START WITH 1 
INCREMENT BY 1 
NO MINVALUE 
NO MAXVALUE 
CACHE 1; 

ALTER TABLE A_id_seq OWNER TO user1; 

ALTER SEQUENCE A_id_seq OWNED BY A.id; 
+0

Поделиться создайте запрос таблицы, который вы использовали для создания таблицы. –

+0

@ Code-Monk CREATE TABLE A (id bigint NOT NULL, символ col1, различающийся (10), col2-символ, изменяющийся (10), CONSTRAINT A_pk ПЕРВИЧНЫЙ КЛЮЧ (id)); ALTER ТАБЛИЦА ВЛАДЕЛЬЦА К user1; СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ A_id_seq НАЧАТЬ С 1 ИНКРЕМЕНТОМ НА 1 НЕТ МИНВАЛА НЕТ МАКСИАЛЬНОЙ КАРЕ 1; ALTER TABLE A_id_seq OWNER TO user1; ALTER SEQUENCE A_id_seq OWNED BY A.id; –

ответ

1

Не следует использовать явную последовательность. Просто определить столбец как serial или bigserial:

CREATE TABLE A (
    id bigserial NOT NULL, 
    col1 character varying(10), 
    col2 character varying(10), 
    CONSTRAINT A_pk PRIMARY KEY (id) 
); 

Тогда вставка будет хорошо. Here - это скрипт SQL.

0
INSERT INTO A(col1, col2) 
(SELECT col3, col4 from B) 

Сбой, поскольку значение по умолчанию не установлено для идентификатора. Значение по умолчанию должно состоять в том, чтобы взять nextval из последовательности.

CREATE SEQUENCE A_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    NO MINVALUE 
    NO MAXVALUE 
    CACHE 1; 

CREATE TABLE A 
(
    id bigint NOT NULL DEFAULT nextval('A_id_seq'::regclass), 
    col1 character varying(10), 
    col2 character varying(10), 
    CONSTRAINT A_pk PRIMARY KEY (id) 
); 

Или вы можете использовать bigserial вместо BIGINT в вашем создавать таблицы, чтобы иметь последовательность, созданную и стандартный набор автоматически. Конечный результат тот же.

Смежные вопросы