MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのPRIMARY KEYとUNIQUE制約の違いとは?主な相違点をわかりやすく解説

MySQLにおけるPRIMARY KEYとUNIQUE制約の違い

MySQLでは、テーブル内のデータの一意性(重複の防止)を保証する手段として、「PRIMARY KEY(主キー)」と「UNIQUE制約」の2つが用意されています。どちらも重複した値の登録を防ぐという共通の目的を持ちますが、動作や用途には重要な違いがあります。

以下の表に、両者の主な相違点をまとめました。

PRIMARY KEY(主キー)UNIQUE制約
1つのテーブルに作成できるのは1つのみ 1つのテーブルに複数追加することが可能
デフォルトでクラスター化インデックスを作成する デフォルトで非クラスター化インデックスを作成する
NULL値を挿入することはできない NULL値を挿入することができる

1. テーブルに設定できる数の違い

PRIMARY KEYは、1つのテーブルに対して1つしか定義できません。これは、主キーがそのテーブルにおける行を一意に識別するための中心的な役割を担っているためです。
一方、UNIQUE制約には数の制限がなく、1つのテーブルに複数のUNIQUE制約を設定できます。例えば、メールアドレスやユーザー名など、複数の列それぞれに一意性を持たせたい場合に有効です。

2. 作成されるインデックスの種類の違い

PRIMARY KEYを設定すると、デフォルトでクラスター化インデックスが作成されます。InnoDBストレージエンジンでは、テーブルの実データ自体が主キーの順序に従って物理的に並べ替えられるため、主キーによる検索は非常に高速になります。
これに対し、UNIQUE制約はデフォルトで非クラスター化インデックスを作成します。インデックスと実データは別々に管理され、インデックスから該当行への参照を行う構造となります。

3. NULL値の扱いの違い

PRIMARY KEYが定義された列には、NULL値を挿入することはできません。主キーは各行を必ず一意に識別できなければならないためです。
一方、UNIQUE制約が付いた列にはNULL値を挿入できます。なお、MySQLではUNIQUE制約の列に複数のNULLを格納できる点にも注意してください(NULLは互いに重複とみなされないため)。

まとめ

PRIMARY KEYは「テーブル内の行を一意に識別するための必須の識別子」、UNIQUE制約は「特定の列に重複を許さないルールを追加するもの」と考えると分かりやすいでしょう。テーブルの設計時には、レコードを一意に識別する列にPRIMARY KEYを設定し、その他の一意性が必要な項目にはUNIQUE制約を使い分けるのが一般的です。

  1. MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?

    結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造

  2. MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?

    MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970     (