MySQLで特定の重複レコードを新しい値に一括置換する方法
MySQLでは、UPDATE文とREPLACE()関数を組み合わせることで、テーブル内に存在する特定の重複レコード(同じ値が複数含まれるデータ)を、まとめて新しい値に置き換えることができます。本記事では、実際にサンプルテーブルを作成しながら、その手順をわかりやすく解説します。
1. サンプルテーブルを作成する
まず、以下のようにテーブルを作成します。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(50)
);
Query OK, 0 rows affected (0.62 sec)
Idカラムは自動採番(AUTO_INCREMENT)の主キー、Nameカラムは名前を格納する文字列型としています。
2. テストデータを挿入する
次に、INSERTコマンドを使っていくつかのレコードを追加します。ここでは意図的に「Chris」という同じ名前を2件登録しています。
mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Name) values('Robert');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(Name) values('David');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Name) values('Mike');
Query OK, 1 row affected (0.13 sec)
3. 現在のレコードを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+----+--------+ | Id | Name | +----+--------+ | 1 | Chris | | 2 | Robert | | 3 | Chris | | 4 | David | | 5 | Mike | +----+--------+ 5 rows in set (0.00 sec)
このように、「Chris」という名前がId=1とId=3の2行に重複して存在していることが確認できます。
4. 重複している値を新しい値に置き換える
ここからが本題です。重複している「Chris」という名前を「Adam Smith」に置き換えるには、以下のようなUPDATE文を実行します。
mysql> update DemoTable set Name=replace(Name,'Chris','Adam Smith'); Query OK, 2 rows affected (0.17 sec) Rows matched: 5 Changed: 2 Warnings: 0
REPLACE(対象カラム, '置換前の文字列', '置換後の文字列')という形式で指定します。「Rows matched: 5 Changed: 2」と表示されているように、全5行が走査され、うち2行(重複していたChrisの行)が更新されたことがわかります。
ポイント: REPLACE()関数は該当するすべての行に対して置換を行います。もし特定の1行だけを変更したい場合は、WHERE Id = 3のように条件を追加してください。
5. 更新結果を確認する
もう一度SELECT文でテーブルの中身を確認しましょう。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+----+------------+ | Id | Name | +----+------------+ | 1 | Adam Smith | | 2 | Robert | | 3 | Adam Smith | | 4 | David | | 5 | Mike | +----+------------+ 5 rows in set (0.00 sec)
重複していた「Chris」の2行が、どちらも「Adam Smith」に正しく置き換えられていることが確認できました。
まとめ
MySQLで重複レコードの値を新しい値にまとめて置き換えるには、UPDATE文とREPLACE()関数を組み合わせるのが最もシンプルな方法です。
- 基本構文:
UPDATE テーブル名 SET カラム名=REPLACE(カラム名, '旧値', '新値'); - WHERE句を付けなければ、該当するすべての行が一括更新されます
- 部分一致の文字列置換にも対応しているため、柔軟なデータ修正が可能です
大量のデータを扱う際は、事前にSELECT文で対象行を確認してからUPDATEを実行すると、意図しない更新を防げますので安心です。
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a
-
MySQLでDEFAULTキーワードを使ってデフォルト値を設定したテーブルを作成する方法
MySQLでは、テーブル作成時にカラムのデータ型の後にDEFAULTキーワードを指定することで、そのカラムにデフォルト値を設定できます。INSERT文で値が指定されなかった場合、自動的にこのデフォルト値が適用されます。テーブルの作成例それでは、実際にデフォルト値を持つテーブルを作成してみましょう。mysql> create table demo33 -> ( -> id int not null auto_increment primary key, -> name varchar(20) not null, -> start_date date default(