この記事では、SQLを使ってデータベースの値を一括変更する方法について紹介します。
商品や会員情報の変更はEC-CUBE管理画面からもできますが、商品数や会員数が増えてくると、一つ一つをいちいち更新するのが面倒な場合も。SQLを使えば、全商品や全会員 または 特定の条件を満たす商品や会員だけを、一気に変更することができます。
本記事では、EC-CUBEの商品テーブル(dtb_product)を例として、よく使われるクエリをピックアップして紹介します。
商品情報などを纏めて変更できる便利な機能ですが、誤った操作をしてしまうと元に戻すのが困難な場合もあります。不安な場合は、変更するテーブルのバックアップを取っておくと安心です。
特定のカラムの値を変更・追記・修正(削除)する
値の変更
特定のテーブルに対し、全レコードの特定のカラムの値を変更するには、以下のような構文を使います。
UPDATE [テーブル名]
SET [カラム名] = [新しい値];
UPDATE dtb_product
SET product_status_id = 1;
- 「product_status_id = 1」→「公開」
- 「product_status_id = 2」→「非公開」
値(テキスト)の追記
特定のテーブルに対し、全レコードの特定のカラムに値(テキスト)を追記するには、文字列結合関数を使います。
データベースシステムで異なる文字列結合方法があり、ここではMySQL、MariaDB、およびPostgreSQLの場合について紹介します。
UPDATE [テーブル名]
SET [カラム名] = CONCAT([カラム名], '追記テキスト');
CONCAT()関数は複数の文字列を結合するときに使われます。
CONCAT(‘Hello, ‘, ‘World!’); と記述すると、「Hello, World!」を返します。
上のコードでは、元々の文字列の最後に追記テキストを結合した値を返し、レコードを更新します。
UPDATE dtb_product
SET description_detail = CONCAT(description_detail, 'セール中です!');
なお、商品詳細の最初にテキストを追加する場合は、CONCAT関数の引数を逆にします。
UPDATE dtb_product
SET description_detail = CONCAT('セール中です!', description_detail);
値(テキスト)の修正(削除)
特定のテーブルに対し、全レコードの特定のカラムの値(テキスト)を修正するには、文字列関数を使います。
データベースシステムで異なる文字列結合方法があり、ここではMySQL、MariaDBおよびPostgreSQLの場合について紹介します。
UPDATE [テーブル名]
SET [カラム名] = REPLACE([カラム名], '修正前のテキスト', '修正後のテキスト');
REPLACE()関数は指定された文字列を別の文字列に置き換えるときに使われます。
REPLACE(original, ‘A’, ‘B’); と記述すると、originalというカラムに含まれる文字列Aを文字列Bに置き換えます。
文字列Aが複数ある場合は、全てのAをBに置き換えます。
UPDATE dtb_product
SET description_detail = REPLACE(description_detail, 'セール中です!', '新商品です!');
なお、特定のテキストを単に削除したい場合は、修正後のテキストに空文字(”)を指定します。
UPDATE dtb_product
SET description_detail = REPLACE(description_detail, 'セール中です!', '');
条件を指定する(AND/OR)
全レコードではなく、特定のレコードのみを対象とするには、WHERE句で条件を指定します。
条件が複数の場合は、AND または ORキーワードを使います。
UPDATE `dtb_product`
SET product_status_id = 1
WHERE id = 1 OR id >= 5;
- 「product_status_id = 1」→「公開」
- 「product_status_id = 2」→「非公開」
他のテーブルと連携して条件を指定する
他のテーブルを参照する必要がある場合、「INNER JOIN」というキーワードを使ってテーブルを結合し、条件を指定します。
以下はMySQLでの構文です。(データベースシステムによって異なります。)
UPDATE [テーブルA]
INNER JOIN [テーブルB] ON [テーブルA].[カラムA] = [テーブルB].[カラムB]
SET [テーブルA].[カラムC] = X
WHERE [テーブルB].[カラムD] = Y;
この構文ではテーブルAとテーブルBを結合しています。
テーブルBのカラムDの値が「Y」のとき、テーブルAのカラムCを「X」に変更する、という内容です。
UPDATE dtb_product
INNER JOIN dtb_product_category ON dtb_product.id = dtb_product_category.product_id
SET dtb_product.product_status_id = 2
WHERE dtb_product_category.category_id = 1;
- 商品とカテゴリーの紐付けは「dtb_product_category」テーブルで行われています。
UPDATE dtb_product
INNER JOIN dtb_product_class ON dtb_product.id = dtb_product_class.product_id
SET dtb_product.description_detail = CONCAT('セール中!', dtb_product.description_detail)
WHERE dtb_product_class.price02 <= 1000;
- 商品と価格の紐付けは「dtb_product_class」テーブルで行われています。
UPDATE dtb_product
INNER JOIN dtb_product_tag ON dtb_product.id = dtb_product_tag.product_id
SET dtb_product.description_detail = CONCAT('セール中!', dtb_product.description_detail)
WHERE dtb_product_tag.tag_id = 3;
- 商品とタグの紐付けは「dtb_product_tag」テーブルで行われています。
これを応用すれば、「特定のタグが付いた商品のみ非公開にする」などの操作も行えますね。
管理画面から商品一つ一つに対して行うより早く、また抜け漏れなく行えるのがメリットです。
ぜひ、使いこなしてみてください!