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