MySQLで1〜3の乱数を使って対応する行を更新する方法
MySQLで指定した範囲内の乱数を生成し、その値を使って行を更新したい場合は、RAND()関数を利用します。更新時の基本構文は以下のとおりです。
UPDATE テーブル名 SET カラム名 = 値 WHERE カラム名2 = (SELECT FLOOR(1 + RAND() * 3));
このクエリの中で使われている FLOOR(1 + RAND() * 3) は、1〜3の範囲の整数をランダムに生成する式です。RAND()は0以上1未満の小数を返すため、それに3を掛けて1を足し、FLOOR()で小数点以下を切り捨てることで、1・2・3のいずれかの整数が得られます。
実際の動きを確認するために、まずサンプル用のテーブルを作成しましょう。
テーブルの作成
mysql> create table updateRowWith1To3
-> (
-> Id int,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.47 sec)テストデータの挿入
次に、INSERT文を使ってレコードを登録します。
mysql> insert into updateRowWith1To3 values(1,'John'); Query OK, 1 row affected (0.24 sec) mysql> insert into updateRowWith1To3 values(2,'Sam'); Query OK, 1 row affected (0.14 sec) mysql> insert into updateRowWith1To3 values(3,'Carol'); Query OK, 1 row affected (0.14 sec) mysql> insert into updateRowWith1To3 values(4,'Mike'); Query OK, 1 row affected (0.16 sec) mysql> insert into updateRowWith1To3 values(5,'Bob'); Query OK, 1 row affected (0.10 sec) mysql> insert into updateRowWith1To3 values(6,'David'); Query OK, 1 row affected (0.17 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみます。
mysql> select * from updateRowWith1To3;
実行結果は以下のとおりです。
+------+-------+ | Id | Name | +------+-------+ | 1 | John | | 2 | Sam | | 3 | Carol | | 4 | Mike | | 5 | Bob | | 6 | David | +------+-------+ 6 rows in set (0.00 sec)
乱数を使ったUPDATE文の実行
ここで、Idが1〜3のランダムな値に一致する行のNameを「Mary」に更新するクエリを実行します。
mysql> update updateRowWith1To3 set Name='Mary' where Id=(select floor( 1 + RAND() * 3)); Query OK, 1 row affected (0.15 sec) Rows matched: 1 Changed: 1 Warnings: 0
この例では、乱数として「1」が生成され、Id=1の行が更新されました。乱数は実行ごとに変わるため、Idが2または3の行が更新対象になる場合もあります。
更新結果の確認
もう一度SELECT文を実行して、テーブルの状態を確認してみましょう。
mysql> select * from updateRowWith1To3;
実行結果は以下のとおりです。
+------+-------+ | Id | Name | +------+-------+ | 1 | Mary | | 2 | Sam | | 3 | Carol | | 4 | Mike | | 5 | Bob | | 6 | David | +------+-------+ 6 rows in set (0.00 sec)
応用:複数行をまとめてランダムに更新する
WHERE句で特定の行を絞るのではなく、テーブル内の全行に対して1〜3のランダムな値を設定したい場合は、次のようにSET句の値そのものに乱数式を指定します。
mysql> update updateRowWith1To3 set Name = (select floor( 1 + RAND() * 3));
この方法を使えば、各行ごとに独立した乱数が割り当てられ、テストデータの生成やサンプリング処理などに便利に活用できます。
-
MySQLのクエリでON UPDATEイベントが発生したかどうかを検出する方法
MySQLでON UPDATEイベントの発生を検出するには? MySQLでは、ROW_COUNT()関数を使うことで、INSERT ... ON DUPLICATE KEY UPDATE文によって新規レコードが挿入されたのか、それとも既存レコードの更新(ON UPDATEイベント)が発生したのかを判別できます。 戻り値の意味は以下のとおりです。 1 が返された場合:新しいレコードが挿入された 2 が返された場合:クエリによって更新処理(ON UPDATEイベント)が発生した 構文は次のとおりです。 select row_count(); サンプルテーブルの作成 まず、テーブルを作成しまし
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(