我有两个表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;
2 回答
不要使用显式序列 . 只需将列定义为
serial
或bigserial
:然后插入就好了 . Here是一个SQL小提琴 .
失败,因为尚未为id设置默认值 . 默认值应该是从序列中获取nextval .
或者您可以在create table中使用bigserial而不是bigint来自动创建序列并自动设置默认值 . 最终结果是一样的 .