web-dev-qa-db-ja.com

主キーと一意制約の違いは何ですか?

誰かがインタビューで私にこの質問をしました...

40
Tim

主キーisテーブルの一意のフィールドですが、テーブルがその行をキーと見なすという点で特別です。これは、他のテーブルがこのフィールドを使用して、それらに対する外部キー関係を作成できることを意味します。

一意制約は、特定のフィールドが一意でなければならないことを単に意味します。

25
Andrew Hare

主キーをnullにすることはできません。ユニークなキーができます。

56
Håvard
  1. 主キーはnullにできませんが、一意にはnull値を1つだけ持つことができます。
  2. 主キーはクラスターインデックスを自動的に作成しますが、一意のキーは作成しません。
  3. テーブルに含めることができる主キーは1つだけですが、一意のキーは複数持つことができます。
13
Giriraj Govil

TL; DR多くはPRIMARY KEY(一意性、参照可能、非null性、クラスタリングなど)によって暗示されますが、UNIQUEを使用して明示的に述べることはできません。

あなたがSELECT * FROM...の便利さを好む種類のコーダーであり、厄介な列をすべてリストする必要がない場合は、PRIMARY KEYが最適です。


relvarは複数のキーを持つことができますが、下線用に1つだけを選択し、その1つを主キーと呼びます。選択は任意なので、プライマリの概念は論理的な観点からはそれほど重要ではありません。ただし、キーの一般的な概念は非常に重要です。候補キーという用語は、キーとまったく同じ意味です(つまり、候補の追加には実質的な意味はありません。各キーを主キーとして指名される候補として見なしたため、Ted Coddによって提案されました)... SQLにより、そのテーブルのキーとして宣言されるテーブルの列のサブセット。また、そのうちの1つを主キーとして指定することもできます。キーをプライマリに指定すると、必要になる可能性のある他の制約に関連して、ある程度の利便性が得られます

キーとは何か?Hugh Darwen作


通常は1つのキーを主キーとして選びます(そして、問題のrelvarの他のキーはすべて代替キーと呼ばれます)。しかし、いくつかのキーがプライマリとして選択されるかどうか、そうである場合は本質的に心理的な問題であり、リレーショナルモデル自体の範囲を超えています。良い慣行として、ほとんどの基本relvarには主キーが必要です。ただし、繰り返しますが、このルールは、それがルールである場合、それ自体はリレーショナルの問題ではありません...強く推奨[SQLユーザー] :ベーステーブルの場合、いずれにしても、PRIMARY KEYやUNIQUEの指定を使用して、そのようなすべてのテーブルに少なくとも1つのキーがあることを確認してください。

SQLとリレーショナル理論:正確なSQLコードの記述方法 C. J.日付

標準SQLではPRIMARY KEY

  • 一意性を意味しますが、明示的に指定できます(UNIQUEを使用)。
  • NOT NULLを意味しますが、列を作成するときに明示的に指定できます(ただし、とにかくnullは避けてください)。
  • FOREIGN KEYで列を省略できますが、明示的に指定できます。
  • テーブルごとに1つのキーに対してのみ宣言できますが、その理由は明らかではありません(最初にこの概念を提案したCoddはそのような制限を課していませんでした)。

一部の製品では、PRIMARY KEYはテーブルのクラスター化インデックスを意味しますが、明示的に指定できます(主キーをクラスター化インデックスにしたくない場合があります!)

一部の人々にとって、PRIMARY KEYは純粋に心理的な意味を持っています:

  • キーが外部キーで参照されることを意味すると彼らは考えています(これはCoddによって提案されましたが、実際には標準SQLベンダーやSQLベンダーによって採用されていません)。
  • 彼らはそれがテーブルの唯一のキーを意味すると考えています(しかし、他の候補キーを強制できないと、データの整合性が失われます)。
  • 彼らは、ビジネスにとって重要ではない「代理」または「人工」キーを意味すると考えています(実際には、ユーザーに公開されることにより、企業に望ましくない重要性を課しています)。
6
onedaywhen

一意のキー制約:

  1. 一意のキー制約は、列の値が一意性を保持する必要があるような制約を提供します。
  2. デフォルトで非クラスター化インデックスを作成します
  3. 一意の制約をいくつでもテーブルに追加できます。
  4. 列にnull値を許可します。

    ALTER TABLE table_name ADD CONSTRAINT UNIQUE_CONSTRAINT UNIQUE(column_name1、column_name2、...)

主キー:

  1. 主キーは、テーブルに列データの一意性を作成します。
  2. 主キーはデフォルトでクラスター化インデックスを作成します
  3. テーブルに作成できるPrimayキーは1つだけです
  4. 複数の列を統合して単一の主キーを形成できます
  5. Null値は許可されません。

    ALTER TABLE table_name ADD CONSTRAINT KEY_CONSTRAINT PRIMARY KEY(column_name)

4
prnawa

すべての主キーは一意の制約ですが、PKに加えて、テーブルには追加の一意の制約を設定できます。

テーブルEmployees、PK EmployeeIDがあるとします。たとえば、SSNに一意の制約を追加できます。

4
Beth

Andrewの回答に加えて、テーブルごとに1つの主キーしか持てませんが、多くの一意の制約を持つことができます。

2
Kevin LaBranche
  1. 主キーの目的は、テーブルの行を一意に識別することです。一意制約は、フィールドの値がテーブルの行間で一意であることを保証します。
  2. テーブルごとに1つの主キーしか持てません。テーブルごとに複数の一意性制約を設定できます。
2

主キーは列の最小セットであり、これらの列に同じ値を持つ2つのレコードはすべての列に同じ値を持ちます。主キーは複数の列で構成できることに注意してください。

一意性制約は、まさにそのように聞こえるものです。

1
Thom Smith

UNIQUE制約は、データベーステーブルの各レコードを一意に識別します。

UNIQUE制約とPRIMARY KEY制約はどちらも、列または列のセットの一意性を保証します。

PRIMARY KEY制約には、自動的にUNIQUE制約が定義されています。

テーブルごとに多くのUNIQUE制約を設定できますが、テーブルごとに1つだけのPRIMARY KEY制約があることに注意してください。

1
Manjeet Barnala

主キーは基本的に(nullでなく+一意)の組み合わせです。また、外部キーを参照する場合、rdbmsには主キーが必要です。

一意のキーは、列の一意性を強制するだけです。一意のキーの場合、フィールドの値はNULLにすることができます。また、外部キーを参照するために使用することはできません。これは、uにnull値を含めることができるため、明らかです

0
Kazoom

これまでのところ、いくつかの良い答えがあります。主キーはnullにできず、それ自体が一意の制約であり、複数の列で構成できるという事実に加えて、使用しているデータベースサーバーに依存するより深い意味があります。

私はSQL Serverユーザーなので、主キーは私にとってより具体的な意味を持っています。 SQL Serverでは、デフォルトで、主キーは「クラスター化インデックス」と呼ばれるものの一部でもあります。クラスタ化インデックスは、特定のテーブルのデータページの実際の順序を定義します。つまり、主キーの順序はディスク上の行の物理的な順序と一致します。

MySqlのテーブル形式の1つ、場合によっては複数もクラスター化インデックスをサポートしていることを知っています。これは、SQL Serverと同じことです。ディスク上の物理的な行の順序を定義します。

Oracleは、インデックスオーガナイズテーブルと呼ばれるものを提供します。これは、主キーによってディスク上の行を並べ替えます。

DB2についてはあまり詳しくありませんが、クラスター化インデックスは、ディスク上の行が別のインデックスと同じ順序で格納されることを意味すると思います。クラスタ化インデックスが主キーと一致する必要があるかどうか、またはそれが個別のインデックスである可能性があるかどうかはわかりません。

0
jrista

ここでの回答の多くは、PKと一意の制約の特性について説明しています。しかし、概念の違いを理解することがより重要です。

主キーは、データベース内のレコードの識別子と見なされます。したがって、これらは、たとえばテーブル間で外部キー参照を作成するときに参照されます。したがって、通常の状況では、主キーにはドメインで何らかの意味を持つ値が含まれていてはなりません(多くの場合、自動的に増分フィールドが使用されます)。

一意の制約は、データベーススキーマにドメイン固有のビジネスルールを適用する方法の1つにすぎません。

PKはレコードの識別子であるため、主キーの値を変更することはできません。

0
Pete
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つのテーブルの違いは何ですか

0
sohan yadav

他のいくつかの回答で述べられているnullを除いて、どちらもテーブルの行全体の一意性を保証します。

さらに、主キーはインデックスに「付属」します。インデックスは、クラスター化されていてもされていなくてもかまいません。

0
alienonland

主キーをnullにすることはできませんが、一意の制約をnullにすることができます。テーブルの主キーを選択すると、そのフィールドに自動的にインデックスが付けられます。

0
Am1rr3zA