我有两个表A(id,col1,col2)和B(col3,col4,col5,col6)
表A中的列“id”是自动生成的,而非空主键。
要将表B中的数据插入表A,我正在尝试
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”生成值?如果我从表B中提供“id”,或者我插入单行(没有select)并为自动生成的列提供“DEFAULT”关键字,则查询有效。
编辑: 表创建查询
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 :(得分: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小提琴。
答案 1 :(得分:1)
INSERT INTO A(col1, col2)
(SELECT col3, col4 from B)
失败,因为尚未为id设置默认值。默认值应该是从序列中获取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)
);
或者您可以在create table中使用bigserial而不是bigint来创建序列并自动为您设置默认值。最终结果是一样的。