POSTGRESQL:INSERT INTO ...使用自动生成的列进行选择

时间:2016-04-09 19:05:17

标签: sql postgresql sql-insert

我有两个表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 个答案:

答案 0 :(得分:1)

不要使用显式序列。只需将列定义为serialbigserial

即可
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来创建序列并自动为您设置默认值。最终结果是一样的。