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

既存のテーブルに一意キー(UNIQUE制約)を追加する方法をわかりやすく解説

ALTER TABLE文で一意キーを追加する基本構文

MySQLでは、ALTER TABLEコマンドを使うことで、すでに存在するテーブルに後から一意キー(UNIQUE制約)を追加できます。基本的な構文は以下の通りです。

ALTER TABLE テーブル名
ADD CONSTRAINT 制約名 UNIQUE(カラム名1, カラム名2, ............N);

カラム名を複数指定すれば、複合ユニーク制約として設定することも可能です。

検証用テーブルの作成

それでは、実際に動きを確認してみましょう。まずは複数のカラムを持つテーブルを作成します。

mysql> create table MovieCollectionDemo
    -> (
        -> MovieId int,
        -> MovieDirectorName varchar(200),
        -> NumberOfSongs int unsigned
    -> );
Query OK, 0 rows affected (0.62 sec)

この時点で、テーブルにはまだ一意制約が設定されていません。DESC文でテーブル構造を確認してみましょう。

mysql> desc MovieCollectionDemo;

実行結果は以下の通りです。「Key」列が空欄になっていることから、どのカラムにも一意キーが設定されていないことがわかります。

+-------------------+------------------+------+-----+---------+-------+
| Field             | Type             | Null | Key | Default | Extra |
+-------------------+------------------+------+-----+---------+-------+
| MovieId           | int(11)          | YES  |     | NULL    |       |
| MovieDirectorName | varchar(200)     | YES  |     | NULL    |       |
| NumberOfSongs     | int(10) unsigned | YES  |     | NULL    |       |
+-------------------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

一意キーの追加手順

先ほどの構文に従って、MovieIdカラムに対して一意キーを追加します。制約名は任意ですが、ここでは「uni_moviecollectio」としています。

mysql> alter table MovieCollectionDemo add constraint uni_moviecollectio unique(MovieId);
Query OK, 0 rows affected (0.46 sec)
Records: 0 Duplicates: 0 Warnings: 0

コマンドが正常に完了しました。念のため、再度テーブル構造を確認して、一意キーが正しく反映されているかチェックしましょう。

mysql> desc MovieCollectionDemo;

実行結果:

+-------------------+------------------+------+-----+---------+-------+
| Field             | Type             | Null | Key | Default | Extra |
+-------------------+------------------+------+-----+---------+-------+
| MovieId           | int(11)          | YES  | UNI | NULL    |       |
| MovieDirectorName | varchar(200)     | YES  |     | NULL    |       |
| NumberOfSongs     | int(10) unsigned | YES  |     | NULL    |       |
+-------------------+------------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

「Key」列に「UNI」と表示されています。これは「MovieId」フィールドに一意キーが正常に設定されたことを示しています。

注意点:重複データが存在する場合

タイトルにあるように、すでに重複した値を含む行が存在するテーブルに一意キーを追加しようとすると、エラー(ERROR 1062: Duplicate entry)が発生して失敗します。その場合は、以下の手順で対処しましょう。

  • 重複データを特定・削除または修正するGROUP BYHAVING COUNT(*) > 1を使って重複行を洗い出し、不要なレコードを削除します。
  • その後にALTER TABLEを実行する:重複が解消されていれば、一意キーの追加は成功します。
  • どうしても重複を残したい場合:代わりに通常のインデックス(INDEX)を作成するか、アプリケーション側での整合性チェックを検討してください。

また、NULL値の扱いにも注意が必要です。MySQLの一意制約では、NULLは互いに重複しているとはみなされないため、複数のNULLを挿入できてしまいます。必要に応じてNOT NULL制約との併用を検討するとよいでしょう。

  1. MySQLでCASE文を使って条件に応じてテーブルの行の値を置き換える方法

    MySQLで条件を設定して行の値を置き換えたい場合は、CASE文を使用します。CASE文を使うことで、UPDATE文の中で各レコードの値に応じて異なる値を柔軟に設定できます。ここでは、実際にテーブルを作成し、データを挿入して、CASE文による置き換えの手順を順番に解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable1481    -> (    -> PlayerScore int   &n

  2. Accessのテーブルで主キーを追加・削除する方法をわかりやすく解説

    Microsoft Accessでテーブルを作成すると、Accessが自動的にデータベーステーブルへ主キーを作成してくれます。しかし、ユーザーが任意のフィールドを主キーとして指定することも可能です。 Accessにおける主キー(Primary Key)とは、テーブル全体を通じて一意の値を持つフィールド、またはフィールドの組み合わせのことです。主キーには以下のような特徴があります。 データベース内の各行を一意に識別できる 常に値が格納されており、空(Null)にならない 一度設定された値が変更されることはない Accessのテーブルで主キーを追加・削除する手順 Accessのデータベーステー