PostgreSQLを実験してみる

PostgreSQLでデータベースを,以下のように作りました.

CREATE TABLE abc_db
(
id serial,
aa CHAR(2),
bb CHAR(10),
atime timestamp without time zone NOT NULL,
cc CHAR(8),
dd CHAR(8),
UNIQUE (aa, bb)
) ;


idは,1から順番に自動的に番号を振りたい列にしています.「シーケンス番号」です.
atimeは時刻.
UNIQUE (aa, bb)は,
aaとbbの関係は,ある日の,ある店舗からデータは,1回だけしか登録されない,
(日と店舗コードの組み合わせは1つのみ登録を認める)といったような関係です.
aaとbbの組み合わせは,ユニークで他と重複しない,という意味と思います.


このデータベースに以下のようにデータを挿入しようとすると

INSERT INTO abc_db (id, aa, bb, atime, cc, dd)
VALUES (1, 1, 1, '2009-08-26 12:34:56', 1000, 100);

エラーがでます.

ERROR: column "id" of relation "abc_db" does not exist
SQLステート:42703


idは,1から順番に自動的に番号を振りたい列だから,INSERTに含まれてはいけないようです.
修正して,

INSERT INTO abc_db (id, aa, bb, atime, cc, dd)
VALUES (1, 1, '2009-08-26 12:34:56', 1000, 100);


すると,

ERROR: INSERT has more target columns than expressions
SQLステート:42601


確かにそうですねー,columns の数があってないし.
そもそもidは「自動的に番号を振りたい列」ですから,これはINSERTの対象外?ーって再確認.


で,最初のidのcolumnsを除いて,修正して

INSERT INTO abc_db (aa, bb, atime, cc, dd)
VALUES (1, 1, '2009-08-26 12:34:56', 1000, 100);

これで整合がとれて,データを挿入できました.
ちなみに,idの行のデータには,ちゃんと自動的に番号が振られてます.


さて,ここでもういちど上とまったく同じ(うまくいった)
INSERTを実行してデータを挿入しようとすると,当然ながら以下のエラーがでます.

ERROR: duplicate key value violates unique constraint "abc_db_aa_key"
SQLステート:23505


そうですね,重複してます...

だんだんわかってきました.


SQLステート:42703
SQLステート:42601
SQLステート:23505