私はグーグルでそれを見つけようとしましたが、満足のいく答えはそこに与えられていません。誰もが確実な違いを説明できますか。
実際、主キーを使用してデータを一意に選択する場合、一意キーの必要性は何ですか?
主キーをいつ使用し、一意キーをいつ使用する必要がありますか?
主キーと一意キーはさまざまな目的に使用されます。それらの用途を理解することは、それらをいつ使用するかを決定するのに役立ちます。
主キーは、テーブル内のデータの行を識別するために使用されます。特定の行を参照する必要がある場合に使用されます。行を識別するためには、PKの値は一意でなければなりません。さらに、ほとんどのdbmsはnullをnullと等しくないものとして扱うため、nullにすることはできません(nullは通常「不明」を意味するため)。テーブルには1つのPKのみを含めることができます。データベース内のすべてのテーブルにはPKが必要ですが(ほとんどのdbmsではこれは強制されていません)、PKは複数の列にまたがることができます。
一意キー制約を使用して、データベース内の2つの行にデータが重複しないようにします。データベースの1つの行には、一意キー制約の値にnullを使用できます。テーブルにはPKが必要ですが、追加の一意のキーは必要ありません。ただし、必要に応じて、テーブルに複数の一意のキーを含めることができます。 PKと同様に、一意のキーは複数の列にまたがることができます。
また、デフォルトでは、PKを使用して多くのdbmsインデックスとディスク上のテーブルを物理的に順序付けすることも知っておく価値があります。つまり、PKによる値の検索は、他の値を連続して使用するよりも高速です。ただし、通常は、必要に応じてこの動作をオーバーライドできます。
「一意のキー」という用語はあいまいであり、自己互換性があります。リレーショナルモデルでは、「キー」とは候補キーを意味し、定義上、とにかく一意です。主キーは、関係の候補キーのいずれか1つにすぎません。したがって、「固有キー」は「候補キー」とまったく同じ意味であり、「主キー」とまったく同じ意味です。違いはありません。
ただし、SQLにはUNIQUE制約と呼ばれるものがあり、SQL PRIMARY KEY制約とは微妙に異なります。両方とも一意性を強制しますが、PRIMARY KEYはテーブルごとに1回しか使用できません。 UNIQUE制約ではNULLも許可されますが、PRIMARY KEY制約では許可されません。
そのため、混乱を招く可能性がある「一意のキー」という用語は、一意制約によって適用されるキーを意味するために最もよく使用されます。 nullを含む列のUNIQUE制約を意味するために使用されることもありますが、nullを含む列のセットは候補キーにはならないため、nullを許可するためにWord "key"を使用するため、列は実際には正しくなく、混乱の原因になります。
主キーと一意キーの違いについて説明する前に、キーとは何か、ビジネスでの役割、SQL/Oracleでの実装方法などを決定することが重要です。
将来のビジネスごと:組織またはビジネスには、非常に多くの物理エンティティ(人、リソース、マシンなど)と仮想エンティティ(タスク、トランザクション、アクティビティ)があります。通常、ビジネスはそれらのビジネスエンティティの情報を記録および処理する必要があります。これらのビジネスエンティティは、キーによってビジネスドメイン全体で識別されます。
RDBMSの見込み:キー(候補キー)、エンティティを一意に識別する値または値のセット。 Db-Tableには、非常に多くのキーが存在し、主キーに適格である可能性があります。そのため、すべてのキー、主キー、一意キーなどは、集合的に候補キーと呼ばれます。
DBAが選択したテーブルの候補キーはプライマリキーと呼ばれ、他の候補キーはセカンダリキーと呼ばれます。
主キーと一意キーの違い
1。動作:主キーはテーブル内の行(レコード)を識別するために使用されますが、一意キーは列内の値が重複しないようにします。
2。インデックス付け:既定では、Sql-engineは、プライマリキーが存在しない場合はプライマリキーにクラスター化インデックスを作成し、一意キーに非クラスター化インデックスを作成します。
3。 Nullability:主キーにはNull値が含まれませんが、一意キーには含まれます。
4。存在:テーブルは最大で1つの主キーを持つことができますが、複数の一意キーを持つことができます。
5。変更可能性:プライマリ値は変更または削除できませんが、一意キー値は変更できます。
主キーは一意のキーです。両方のタイプのキーは、テーブル内の単一の行を一意に識別するのに役立ちます。多くのRDBMSでは、いくつかの異なる実装上の理由から、テーブル上の一意のキーの1つを「主キー」として指定する必要があります。データの整合性に関しては、違いはありません。
主キーはnullを許可せず、一意のキーは1つのnullを許可します(sqlサーバーとOracleの複数のnull)テーブルは1つの主キーのみを持つことができますが、多くの一意のキー
外部キー関係を設定する場合は主キーを使用します
以下は、各テーブルに列が1つしかない小さな例です。
--primary key table
CREATE TABLE PrimaryTest (id INT PRIMARY KEY NOT NULL)
GO
-- foreign key table
CREATE TABLE ForeignTest (Pkid INT NOT NULL)
GO
--relationship
ALTER TABLE dbo.ForeignTest ADD CONSTRAINT
FK_ForeignTest_PrimaryTest FOREIGN KEY
(
Pkid
) REFERENCES dbo.PrimaryTest
(
id
) ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
主キー表に行を挿入します
insert PrimaryTest values(1)
主キーテーブルに存在する値を持つ行を外部キーテーブルに挿入します
insert ForeignTest values(1)
これは、値2が主キーテーブルに存在しないため、失敗します
insert ForeignTest values(2)
メッセージ547、レベル16、状態0、行1 INSERTステートメントは、外部キー制約 "FK_ForeignTest_PrimaryTest"と競合しました。データベース "aspnetdb"、テーブル "dbo.PrimaryTest"、列 'id'で競合が発生しました。ステートメントは終了されました。
別の例を追加するだけです:
各ユーザーがメールアドレスを持っているユーザーデータを保持するテーブルを考えてください。 2人のユーザーが同じメールアドレスを持つことはできないため、その列は一意のキーになります。主キーになる可能性はありますが(ストリングを主キーにしたことはありません)、そうである必要はありません。
両方ともテーブルの行に一意の識別を表していますが、少し違いがあります
PRIMARYキーはNULL値を許可しません
ながら
UNIQUEキーは、1つのNULL値のみを許可します。
それが主な違いです..
NOT NULLは、その特定の列のすべてのエントリがNULLであってはならないことを意味します。 UNIQUEは、列の各エントリが個別であることを意味します。 PRIMARY KEYは、列のすべてのエントリが明確であり、nullでないことを意味します。
だから単純に..
PRIMARY KEY= UNIQUE + NOT NULL
主キー制約
1。主キーはnullを許可できません。
2。複数の主キーは許可されていません。
3。一部のRDBMSでは、主キーがデフォルトでクラスター化インデックスを生成します。
一意の制約
1。ヌルを許可する列に一意制約を定義できます。
2。複数の一意のキーが許可されます。
3。一部のRDBMSでは、一意のキーがデフォルトで非クラスター化インデックスを生成します。
ソースウィキペディア
テーブルごとに多くのUNIQUE制約を設定できますが、テーブルごとに1つのPRIMARY KEY制約のみを設定できます。より多くの情報を見つけることができます こちら