/bonvhp/webapp2/PostgreSQL       [後へ]   [目次へ]   [次へ] ~ [] ~

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 の完成です。
/bonvhp/webapp2/PostgreSQL       [後へ]   [目次へ]   [次へ]