私はグーグルでそれを見つけようとしましたが、満足のいく答えはありません。誰でも明確な違いを説明できますか。
実際、主キーを使用してデータを一意に選択する場合、一意キーの必要性は何ですか?
いつ主キーを使用し、いつ一意キーを使用する必要がありますか?
私はグーグルでそれを見つけようとしましたが、満足のいく答えはありません。誰でも明確な違いを説明できますか。
実際、主キーを使用してデータを一意に選択する場合、一意キーの必要性は何ですか?
いつ主キーを使用し、いつ一意キーを使用する必要がありますか?
主キーと一意キーはさまざまな目的で使用されます。それらが何のために使用されるかを理解すると、それらをいつ使用するかを決定するのに役立ちます。
主キーは、テーブル内のデータの行を識別するために使用されます。特定の行を参照する必要があるときはいつでも使用されます。行を識別するために、PK の値は一意である必要があります。さらに、ほとんどの DBMS は null を null と等しくないと見なすため、null にすることはできません (通常、null は「不明」を意味するため)。テーブルは 1 つの PK のみを持つことができます。データベース内のすべてのテーブルには PK が必要であり (ただし、これはほとんどの DBMS では強制されていません)、PK は複数の列にまたがることができます。
データベース内の 2 つの行でデータが重複しないようにするために、ユニーク キー制約が使用されます。データベース内の 1 つの行は、一意キー制約の値として null を持つことができます。テーブルには PK が必要ですが、一意のキーを追加する必要はありません。ただし、必要に応じて、テーブルに複数の一意のキーを含めることができます。PK と同様に、一意のキーは複数の列にまたがることができます。
デフォルトでは、多くの DBMS インデックスおよびディスク上のテーブルの物理的な順序付けが PK を使用していることも知っておく価値があります。これは、PK で値を検索する方が、行内の他の値を使用するよりも高速であることを意味します。ただし、通常、必要に応じてこの動作をオーバーライドできます。
「一意のキー」という用語は、あいまいであり、同義語でもあります。リレーショナル モデルでは、「キー」は候補キーを意味し、定義上、いずれにしても一意です。主キーは、リレーションの候補キーのいずれかです。したがって、「一意のキー」は「主キー」とまったく同じ意味の「候補キー」とまったく同じ意味です。違いはありません。
ただし、SQL には UNIQUE 制約と呼ばれるものがあり、SQL の PRIMARY KEY 制約とは微妙に異なります。どちらも一意性を強制しますが、PRIMARY KEY はテーブルごとに 1 回しか使用できません。UNIQUE 制約では null も許可されますが、PRIMARY KEY 制約では許可されません。
そのため、紛らわしい可能性のある「一意のキー」という用語は、UNIQUE 制約によって強制されるキーを意味するために最もよく使用されます。null 許容列の UNIQUE 制約を意味するために使用されることもありますが、null を含む一連の列は候補キーになることができないため、null 許容の「キー」という単語を使用することは私の意見では非常に疑わしい用語です。列は実際には正しくなく、混乱の原因となります。
主キーは null を許可しません。一意のキーは 1 つの null を許可します (SQL サーバーでは 1 つの null、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 ステートメントは、FOREIGN KEY 制約 "FK_ForeignTest_PrimaryTest" と競合しました。データベース「aspnetdb」、テーブル「dbo.PrimaryTest」、列「id」で競合が発生しました。ステートメントは終了されました。
主キーは一意のキーです。どちらのタイプのキーも、テーブル内の単一の行を一意に識別するのに役立ちます。多くの RDBMS では、いくつかの異なる実装上の理由から、テーブルの一意のキーの 1 つを「主キー」として指定する必要があります。データの整合性に関しては、違いはありません。
別の例を追加するだけです。
各ユーザーが電子メールアドレスを持っている、ユーザーデータを保持するテーブルを考えてみてください。2人のユーザーが同じメールアドレスを持つことはできないため、列は一意のキーになります。これは主キーである可能性がありますが(文字列を主キーにしたことはありません)、そうである必要はありません。
どちらもテーブル内の行に対する一意の識別を表していますが、ほとんど違いはありません。
PRIMARY キーは NULL 値を許可しません
その間
UNIQUE キーは 1 つの NULL 値のみを許可します。
それが主な違いです..
主キーの制約
1. 主キーは null を許可できません。
2. 複数の主キーは使用できません。
3. 一部の RDBMS では、主キーによってデフォルトでクラスタ化インデックスが生成されます。
UNIQUE 制約
1. NULL を許可する列に対して UNIQUE 制約を定義できます。
2. 複数の一意のキーが許可されます。
3. 一部の RDBMS では、一意のキーによってデフォルトで非クラスター化インデックスが生成されます。
ソースウィキペディア
一意のキーは他のキーと一緒に提供されますが、主キーは他のキーと一緒に提供されません。主キーは、他のキーとの関連付けなしで使用されます。