pgAdmin III 経由で CONSTRAINT を含む CREATE TABLE 文を流す場合

以下のような CREATE TABLE 文を流すとする。

CREATE TABLE awesome
(
   id serial NOT NULL, 
   "name" character varying(255) NOT NULL, 
   created_at timestamp without time zone NOT NULL, 
   updated_at timestamp without time zone NOT NULL, 
   CONSTRAINT awesome_id_seq PRIMARY KEY (id)
) 
WITH (
  OIDS = FALSE
);

これを pgAdmin 上で実行すると、以下のようなエラーが出て失敗する。

********** エラー **********

ERROR: relation "awesome_id_seq" already exists

エラー的には「awesome_id_seq が既にあるからダメ」という感じなのだけど、当然 awesome_id_seq は存在しない。どう言うことなのかと思って上の NOTICE 文を見ると、

NOTICE:  CREATE TABLE will create implicit sequence "awesome_id_seq" for serial column "awesome.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "awesome_id_seq" for table "awesome"
ERROR:  relation "awesome_id_seq" already exists

これを大まかに訳すると、

NOTICE: serial カラムの "awesome.id" あるから "awesome_id_seq" シーケンス作るわ
NOTICE: "awesome" テーブルの "awesome_id_seq" を暗黙的に主キーにするわ
ERROR: "awesome_id_seq" もう存在してるんだけど

という感じ。つまり定義しなくても作ってくれているが為に、わざわざ CONSTRAINT を定義しているので失敗しているという事になる。

CREATE TABLE awesome
(
   id serial NOT NULL, 
   "name" character varying(255) NOT NULL, 
   created_at timestamp without time zone NOT NULL, 
   updated_at timestamp without time zone NOT NULL
) 
WITH (
  OIDS = FALSE
);

なので、なんか釈然としないけど CONSTRAINT を省けば通る。