2016-04-09 12 views
0

でSELECT B(COL3、COL4、COL5、COL6)POSTGRESQL:INSERT INTO ...私は、2つのテーブル(ID、COL1、COL2)を有し、自動生成されたカラム

表Aの列 "ID" nullではなく、自動生成された主キーです。表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"の値を自動生成しないのはなぜですか?テーブルBの "id"を指定した場合、または選択なしの単一行を挿入して自動生成列に "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 character varying(10)、col2 character varying(10)、CONSTRAINT A_pk PRIMARY KEY(id)); user1の所有者を変更します。 CREATE SEQUENCE A_id_seq 1つの増分で1つの増分なしで最大1つのキャッシュなし1; ALTER TABLE A_id_seqユーザーuser1; ALTER SEQUENCE A_id_seqは、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 Fiddleです。

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

idにデフォルト値が設定されていないため、失敗します。デフォルト値は、シーケンスから次の値を取るべきです。

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) 
); 

それとも、シーケンスを作成し、あなたのために自動的に設定されたデフォルトを持っているあなたの作成し、テーブルに代わりのbigintのBIGSERIAL使用することができます。最終的な結果は同じです。

関連する問題