既存のテーブルに一意キー(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 BYやHAVING COUNT(*) > 1を使って重複行を洗い出し、不要なレコードを削除します。 - その後にALTER TABLEを実行する:重複が解消されていれば、一意キーの追加は成功します。
- どうしても重複を残したい場合:代わりに通常のインデックス(INDEX)を作成するか、アプリケーション側での整合性チェックを検討してください。
また、NULL値の扱いにも注意が必要です。MySQLの一意制約では、NULLは互いに重複しているとはみなされないため、複数のNULLを挿入できてしまいます。必要に応じてNOT NULL制約との併用を検討するとよいでしょう。
-
MySQLでCASE文を使って条件に応じてテーブルの行の値を置き換える方法
MySQLで条件を設定して行の値を置き換えたい場合は、CASE文を使用します。CASE文を使うことで、UPDATE文の中で各レコードの値に応じて異なる値を柔軟に設定できます。ここでは、実際にテーブルを作成し、データを挿入して、CASE文による置き換えの手順を順番に解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable1481 -> ( -> PlayerScore int &n
-
Accessのテーブルで主キーを追加・削除する方法をわかりやすく解説
Microsoft Accessでテーブルを作成すると、Accessが自動的にデータベーステーブルへ主キーを作成してくれます。しかし、ユーザーが任意のフィールドを主キーとして指定することも可能です。 Accessにおける主キー(Primary Key)とは、テーブル全体を通じて一意の値を持つフィールド、またはフィールドの組み合わせのことです。主キーには以下のような特徴があります。 データベース内の各行を一意に識別できる 常に値が格納されており、空(Null)にならない 一度設定された値が変更されることはない Accessのテーブルで主キーを追加・削除する手順 Accessのデータベーステー