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 を省けば通る。