PostgreSQL:主キーとシーケンス
●serial 列の作成
テーブルには、複数のデータ (= 行) が保存されるでしょう。
保存したデータを取り出すには、
取り出すデータが指定できる必要があります。
つまり、個々のデータに固有の情報を持たせるのです。
一番簡単な方法は、
データ毎に、通し番号を付ける事です。
1列目には 1、2列目には 2、
といった値を持った「列」を用意します。
PgAdmin では、データ型に serial を使用する事で、
この通し番号を持つ列を簡単に作成できます。
では、実際に serial の列を作成してみましょう。
[データベース]、[sql_sample]、[スキーマ]、[public]、[テーブル]、[person]、
[列] までたどり着いてください。
・[列] を右クリック
・新しい列...
・「プロパティ」タブで、
名前:person_id
データ型:serial
・[OK]
これで、列 person_id ができました。
●シーケンス
改めて、person_id のプロパティを見ると、
「プロパティ」タブのデータ型は integer に変わっていて、
「定義」タブの NOT NULL も指定しなかったのに、チェックが入っています。
更に、「定義」タブの「初期の値」には、
nextval('person_person_id_seq'::regclass)
という呪文が入っています。
nextval は、引数の値を1つ増やして、増やした後の値を返す関数です。
で、
引数に入っている
'person_person_id_seq'
ですが、
PgAdmin を見ると、
[スキーマ]、[public]、[シーケンス] の下に、
[person_person_id_seq] が増えているのが確認できるでしょう。
「シーケンス」は、
自動的に連続した番号を生成するのに便利な機能です。
SQL 的には、
列の定義と、シーケンスの定義は別物ですが、
PgAdmin の serial 型を使用すると、
2つを自動的に作成してくれるわけです。
ちなみに、シーケンスの名前は、スキーマで一意でなければならないのですが、
PgAdmin が、
「テーブル名、ハイフン、列名、ハイフン、seq」で
自動的に生成してくれます。
# [person_person_id_seq] を右クリックし、プロパティを開きます。
# 「プロパティ」タブや、「オプション」タブで、
# シーケンスの状態を見ておいてください。
実際にデータを追加する際には、
この serial の列は、何も指定しないでおきます。
すると、PostgreSQL が、勝手に通し番号を振ってくれます。
●主キー制約
列を特定するための「通し番号」は、上記 serial を使えば事足ります。
が、
実用としては、列が特定できさえすれば良いので、
場合によっては、複数の列の組み合わせを使っても構いません。
これを SQL 的に表現するのが、
主キー制約です。
# プライマリーキー制約ともいいます。
テーブル person では、person_id 1列で十分なのですが、
SQL 一般では、主キー制約が必要なので、
ここでも設定しておきます。
[テーブル]、[person]、[制約]、
までたどり着いてください。
では、実際に主キー制約を作成してみましょう。
・[制約] を右クリック
・新規オブジェクト...
・新しい主キー...
・「列」タブ
・下方にある「列」プルダウンメニューで、
person_id
を選択し、「追加」
・[OK]
これで、テーブル person の主キーに person_id を指定しました。
# もし、複数列を指定するのなら、
# 上記の場面で、必要なだけ列を追加すればいいです。
[テーブル]、[person]、[制約] の下に、
[person_pkey] が追加されているのを確認し、
プロパティを見ておいてください。
長々と続きましたが、
これで、データベース sql_sample の完成です。