首页 文章

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

提问于
浏览
0

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

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

相关问题