誰かがインタビューで私にこの質問をしました...
主キーisテーブルの一意のフィールドですが、テーブルがその行をキーと見なすという点で特別です。これは、他のテーブルがこのフィールドを使用して、それらに対する外部キー関係を作成できることを意味します。
一意制約は、特定のフィールドが一意でなければならないことを単に意味します。
主キーをnullにすることはできません。ユニークなキーができます。
TL; DR多くはPRIMARY KEY
(一意性、参照可能、非null性、クラスタリングなど)によって暗示されますが、UNIQUE
を使用して明示的に述べることはできません。
あなたがSELECT * FROM...
の便利さを好む種類のコーダーであり、厄介な列をすべてリストする必要がない場合は、PRIMARY KEY
が最適です。
relvarは複数のキーを持つことができますが、下線用に1つだけを選択し、その1つを主キーと呼びます。選択は任意なので、プライマリの概念は論理的な観点からはそれほど重要ではありません。ただし、キーの一般的な概念は非常に重要です。候補キーという用語は、キーとまったく同じ意味です(つまり、候補の追加には実質的な意味はありません。各キーを主キーとして指名される候補として見なしたため、Ted Coddによって提案されました)... SQLにより、そのテーブルのキーとして宣言されるテーブルの列のサブセット。また、そのうちの1つを主キーとして指定することもできます。キーをプライマリに指定すると、必要になる可能性のある他の制約に関連して、ある程度の利便性が得られます
通常は1つのキーを主キーとして選びます(そして、問題のrelvarの他のキーはすべて代替キーと呼ばれます)。しかし、いくつかのキーがプライマリとして選択されるかどうか、そうである場合は本質的に心理的な問題であり、リレーショナルモデル自体の範囲を超えています。良い慣行として、ほとんどの基本relvarには主キーが必要です。ただし、繰り返しますが、このルールは、それがルールである場合、それ自体はリレーショナルの問題ではありません...強く推奨[SQLユーザー] :ベーステーブルの場合、いずれにしても、PRIMARY KEYやUNIQUEの指定を使用して、そのようなすべてのテーブルに少なくとも1つのキーがあることを確認してください。
SQLとリレーショナル理論:正確なSQLコードの記述方法 C. J.日付
標準SQLではPRIMARY KEY
UNIQUE
を使用)。NOT NULL
を意味しますが、列を作成するときに明示的に指定できます(ただし、とにかくnullは避けてください)。FOREIGN KEY
で列を省略できますが、明示的に指定できます。一部の製品では、PRIMARY KEY
はテーブルのクラスター化インデックスを意味しますが、明示的に指定できます(主キーをクラスター化インデックスにしたくない場合があります!)
一部の人々にとって、PRIMARY KEY
は純粋に心理的な意味を持っています:
一意のキー制約:
列にnull値を許可します。
ALTER TABLE table_name ADD CONSTRAINT UNIQUE_CONSTRAINT UNIQUE(column_name1、column_name2、...)
主キー:
Null値は許可されません。
ALTER TABLE table_name ADD CONSTRAINT KEY_CONSTRAINT PRIMARY KEY(column_name)
すべての主キーは一意の制約ですが、PKに加えて、テーブルには追加の一意の制約を設定できます。
テーブルEmployees、PK EmployeeIDがあるとします。たとえば、SSNに一意の制約を追加できます。
Andrewの回答に加えて、テーブルごとに1つの主キーしか持てませんが、多くの一意の制約を持つことができます。
主キーは列の最小セットであり、これらの列に同じ値を持つ2つのレコードはすべての列に同じ値を持ちます。主キーは複数の列で構成できることに注意してください。
一意性制約は、まさにそのように聞こえるものです。
UNIQUE制約は、データベーステーブルの各レコードを一意に識別します。
UNIQUE制約とPRIMARY KEY制約はどちらも、列または列のセットの一意性を保証します。
PRIMARY KEY制約には、自動的にUNIQUE制約が定義されています。
テーブルごとに多くのUNIQUE制約を設定できますが、テーブルごとに1つだけのPRIMARY KEY制約があることに注意してください。
主キーは基本的に(nullでなく+一意)の組み合わせです。また、外部キーを参照する場合、rdbmsには主キーが必要です。
一意のキーは、列の一意性を強制するだけです。一意のキーの場合、フィールドの値はNULLにすることができます。また、外部キーを参照するために使用することはできません。これは、uにnull値を含めることができるため、明らかです
これまでのところ、いくつかの良い答えがあります。主キーはnullにできず、それ自体が一意の制約であり、複数の列で構成できるという事実に加えて、使用しているデータベースサーバーに依存するより深い意味があります。
私はSQL Serverユーザーなので、主キーは私にとってより具体的な意味を持っています。 SQL Serverでは、デフォルトで、主キーは「クラスター化インデックス」と呼ばれるものの一部でもあります。クラスタ化インデックスは、特定のテーブルのデータページの実際の順序を定義します。つまり、主キーの順序はディスク上の行の物理的な順序と一致します。
MySqlのテーブル形式の1つ、場合によっては複数もクラスター化インデックスをサポートしていることを知っています。これは、SQL Serverと同じことです。ディスク上の物理的な行の順序を定義します。
Oracleは、インデックスオーガナイズテーブルと呼ばれるものを提供します。これは、主キーによってディスク上の行を並べ替えます。
DB2についてはあまり詳しくありませんが、クラスター化インデックスは、ディスク上の行が別のインデックスと同じ順序で格納されることを意味すると思います。クラスタ化インデックスが主キーと一致する必要があるかどうか、またはそれが個別のインデックスである可能性があるかどうかはわかりません。
ここでの回答の多くは、PKと一意の制約の特性について説明しています。しかし、概念の違いを理解することがより重要です。
主キーは、データベース内のレコードの識別子と見なされます。したがって、これらは、たとえばテーブル間で外部キー参照を作成するときに参照されます。したがって、通常の状況では、主キーにはドメインで何らかの意味を持つ値が含まれていてはなりません(多くの場合、自動的に増分フィールドが使用されます)。
一意の制約は、データベーススキーマにドメイン固有のビジネスルールを適用する方法の1つにすぎません。
PKはレコードの識別子であるため、主キーの値を変更することはできません。
create table a1 (id int,name varchar(20),city varchar(20),state varchar(20),country varchar(28) constraint pk_a1 primary key(id));
insert into a1 values(101,'sohan','gkp','up','india');
create table a1 (id int primary key,name varchar(20),city varchar(20),state varchar(20),country varchar(28));
insert into a1 values(101,'sohan','gkp','up','india');
主キーと制約を使用したこれら2つのテーブルの違いは何ですか
他のいくつかの回答で述べられているnullを除いて、どちらもテーブルの行全体の一意性を保証します。
さらに、主キーはインデックスに「付属」します。インデックスは、クラスター化されていてもされていなくてもかまいません。
主キーをnullにすることはできませんが、一意の制約をnullにすることができます。テーブルの主キーを選択すると、そのフィールドに自動的にインデックスが付けられます。