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
そうですね,重複してます...
だんだんわかってきました.