Loading AI tools
リレーション内の属性 (列) のセットで、タプル (行) を一意に指定する ウィキペディアから
主キー(しゅキー、英語: primary key)とは、関係データベースにおいて、組(レコード)の識別子として利用するのにもっとも好ましいものとして、関係(テーブル)毎にただ一つ設計者により選択・定義された候補キーをいう。つまり、関係に格納されたレコードを一意に識別するための属性(列、アトリビュート)またはその集合のうち、そのために通常利用されるべき特定の一つをいう。
関係データベース管理システム(RDBMS)やミドルウェア、アプリケーションなどでレコードの識別子が必要な場合、主キーがそのために使われることが多い。ただ、そうしなければならない必然性はなく、他の候補キーを使っても良い。したがって、主キーの理論上の意義は大きくないが、実務上は、そのわかりやすさなどから広く使われている概念である。 ただし、主キーにはNULLの存在が許されないが、候補キーには許されるという差があるとする立場もある(レコードの追加、更新時の制約として主キーを考える場合、一意性制約にNOT NULL制約を加えたものが主キー制約であると考えることができる)。
関係に存在する候補キーが一つであるときは、その候補キーが当然に主キーとなる。
なお、主キーでない候補キーは代理キー(alternate key)という。
候補キーが複数あるとき、組を識別するという機能においてそれらの間に差異はないから、主キーにどれを選んでも論理的には問題がない。しかし実用上は、以下のような指針に従って選択するのがよい。
関係(テーブル)作成の際に、以下のようにSQLステートメントを記述して主キーを設定する。
1. テーブル制約として定義する方法:
CREATE TABLE テーブル名 ( 列名1 列1データ型, 列名2 列2データ型, …, CONSTRAINT キー名 PRIMARY KEY(列名1) );
2. 列制約として定義する方法:
CREATE TABLE テーブル名 ( 列名1 列1データ型 CONSTRAINT キー名 PRIMARY KEY, 列名2 列2データ型, … );
3. 複数の列に対して主キーを設定する方法:
CREATE TABLE テーブル名 ( 列名1 列1データ型, 列名2 列2データ型, …, CONSTRAINT キー名 PRIMARY KEY(列名1,列名2・・) );
4. ALTER TABLE ステートメントを使うこともできる。
連番(順序・シーケンスとも呼ばれる)のように、一意性を確保するためだけにシステム内部で生成され、利用者が関知しない情報を格納する属性からなる主キーを人工キー、人為キー (artificial key) ないし別名キー (alias key)、代替キー (surrogate key) などといい、逆に、システム外部から格納すべきものとして与えられる情報を格納する属性からなる主キーを自然キー (natural key) ということがある。
利用者が関知しないという点について、エドガー・F・コッドによる定義では、人工キーの値が、利用者に提示されたり、利用者の発行する問い合わせのキーとなったりしないことが要求されている。しかし一般には、単に利用者の意向と無関係にシステムが生成するものを広く人工キーと呼ぶことも多い。
設計された関係の属性に候補キーがない場合には、人工キーを付け加えざるを得ないが(前述の生徒名簿関係に生徒番号がなかった場合を考えよ)、そうでない場合にも人工キーを付け加えるべきか、そのようなことは避けて自然キーを使うべきかについては議論がある。自然キーには、関係に余計な属性を付け加える必要がないという利点があるが、複合キーになりがちであるし、外部の状況が変化すれば変更も必要となるから、前述の指針からみると望ましくない選択となることがありうる。人工キーの利点・欠点はその逆である。実際には、これらの得失のバランスは、場合により異なるから、ケース・バイ・ケースで判断すべきであろう。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.