MySQL で複数の行の複数の列を異なる値で更新する
この記事では、CASE
ステートメント、IF()
関数、INSERT ... ON DUPLICATE KEY UPDATE
句、UPDATE
と JOIN()
関数を使用して複数の列を更新する方法を学びます。 MySQL で異なる値を持つ複数の行。
MySQL で複数のレコード (行) の複数の列を異なる値で更新する
場合によっては、データベース内の複数の行の複数の列を異なる値で更新する必要があります。 テーブルにいくつかのレコードがある場合は、複数の UPDATE
ステートメントを使用しても問題ありません。
テーブルに何百万もの行があるとします。 テーブルを更新する方法のいくつかを以下に示します。
CASE
ステートメントを使用します。IF()
関数を使用します。INSERT ... ON DUPLICATE KEY UPDATE
を使用します。JOIN()
でUPDATE
を使用します。
上記のアプローチを学習するには、ID
が主キーである属性 (列) として ID
、JavaScore
、および PythonScore
を持つ students
という名前のテーブルを作成します。 このチュートリアルに従って、以下のクエリを使用してテーブルを作成および設定できます。
コード例:
# create a table
CREATE TABLE students(
ID INT NOT NULL,
JavaScore INT NOT NULL,
PythonScore INT NOT NULL,
PRIMARY KEY (ID));
# insert data
INSERT INTO students (ID, JavaScore, PythonScore)
VALUES
(1, 70, 65),
(2, 75, 80),
(3, 81, 89),
(4, 50, 70);
# display table data
SELECT * FROM students;
出力:
ID | Javaスコア | PythonScore |
---|---|---|
1 | 70 | 65 |
2 | 75 | 80 |
3 | 81 | 89 |
4 | 50 | 70 |
students
テーブルを作成してデータを入力したら、前述の方法を使用できます。
CASE
ステートメントを使用する
コード例:
UPDATE students
SET JavaScore = (case
when ID = 1 then 75
when ID = 2 then 80
when ID = 3 then 86
when ID = 4 then 55
end),
PythonScore = (case
when ID = 1 then 70
when ID = 2 then 85
when ID = 3 then 94
when ID = 4 then 75
end)
WHERE ID in (1,2,3,4);
SELECT
ステートメントを使用して、更新された結果を取得します。
SELECT * FROM students;
出力:
ID | Javaスコア | PythonScore |
---|---|---|
1 | 75 | 70 |
2 | 80 | 85 |
3 | 86 | 94 |
4 | 55 | 75 |
すべての条件を通過し、最初の条件が満たされたときに項目 (値) を出力する CASE
ステートメントを使用して、複数の行の複数の列を異なる値で更新します (if-then-else
ステートメントのように)。 条件が TRUE
になると読み取りを停止し、対応する結果を返します。
TRUE
条件がないと仮定すると、ELSE
部分が実行されます。 ELSE
セクションがない場合は、NULL
を返します。
すべてのレコードで一定に保ちたいDATETIME
タイプの別のフィールドがある場合、クエリは次のようになります。
コード例:
UPDATE students
SET JavaScore = (case
when ID = 1 then 75
when ID = 2 then 80
when ID = 3 then 86
when ID = 4 then 55
end),
PythonScore = (case
when ID = 1 then 70
when ID = 2 then 85
when ID = 3 then 94
when ID = 4 then 75
end),
DATEANDTIME = NOW()
WHERE ID in (1,2,3,4);
IF()
関数を使用する
コード例:
UPDATE students SET
JavaScore = IF(ID=1,76,IF(ID=2,81,IF(ID=3,87,IF(ID=4,56,NULL)))),
PythonScore = IF(ID=1,71,IF(ID=2,86,IF(ID=3,95,IF(ID=4,76,NULL))))
WHERE ID IN (1,2,3,4);
SELECT
コマンドを実行して、students
テーブルの新しい値を取得します。
SELECT * FROM students;
出力:
ID | Javaスコア | PythonScore |
---|---|---|
1 | 76 | 71 |
2 | 81 | 86 |
3 | 87 | 95 |
4 | 56 | 76 |
条件が満たされた場合に特定の値を返す IF()
関数を使用します。 それ以外の場合は、指定された別の値を返します。 構文は IF(条件, TrueValue, FalseValue)
です。
ID=1
条件が満たされている場合、なぜ別の IF()
に行くのかという疑問があるかもしれません。 次のようにネストされた IF()
関数を使用して、複数の IFs
を作成します。
IF(condition, TrueValue,
IF(condition, TrueValue,
IF(condition, TrueValue,
IF(condition, TrueValue, FalseValue)
)
)
)
もっと分かりやすくしましょう。 次のスニペットでは、複数の IF
があり、条件が満たされているかどうかは問題ではありません。
すべての IF
条件がチェックされ、それに応じて値が設定されます。 最後の IF
には ELSE
部分があり、4 番目の IF
条件が FALSE
の場合にのみ実行されます。
IF Condition
TrueValue
IF Condition
TrueValue
IF Condition
TrueValue
IF Condition
TrueValue
ELSE
FalseValue
ネストされた IF()
関数を使用する理由は、複数の行を異なる値で更新するためです。
複数の行の複数の列を更新する必要がある場合は、ネストされた IF()
関数よりも理解しやすく管理しやすいため、CASE
ステートメントを使用することをお勧めします。
INSERT ... ON DUPLICATE KEY UPDATE
を使用
コード例:
INSERT INTO students (ID, JavaScore, PythonScore)
VALUES
(1, 77, 72),(2, 82, 87),(3, 88, 96),(4, 57, 77)
ON DUPLICATE KEY UPDATE
JavaScore = VALUES(JavaScore),
PythonScore = VALUES(PythonScore);
出力:
ID | Javaスコア | PythonScore |
---|---|---|
1 | 77 | 72 |
2 | 82 | 87 |
3 | 88 | 96 |
4 | 57 | 77 |
この例は INSERT ... ON DUPLICATE KEY UPDATE
を示しています。 通常、PRIMARY KEY
または UNIQUE
インデックスで重複が発生する可能性のある特定のテーブルに INSERT
すると、エラーが発生します。
ただし、ON DUPLICATE KEY UPDATE
を指定すると、MySQL は既存のレコードを最新の値で更新します。 PRIMARY KEY
に重複が見つかった場合、その特定の列の値は現在の値に設定されます。
このチュートリアルを書いているとき、VALUES()
関数は機能していますが、VALUES()
関数は非推奨であり、将来のリリースで削除されるという警告が表示されます。 さらに支援が必要な場合は、MySQL Documentation を検討してください。
UPDATE
を JOIN()
とともに使用する
コード例:
UPDATE students std
JOIN (
SELECT 1 AS ID, 78 AS JavaScore, 73 AS PythonScore
UNION ALL
SELECT 2 AS ID, 83 AS JavaScore, 88 AS PythonScore
UNION ALL
SELECT 3 AS ID, 89 AS JavaScore, 97 AS PythonScore
UNION ALL
SELECT 4 AS ID, 58 AS JavaScore, 78 AS PythonScore
) temp
ON std.ID = temp.ID
SET std.JavaScore = temp.JavaScore, std.PythonScore = temp.PythonScore;
このソリューションは、セーフ モード
が無効になっている場合にのみ機能します。 Edit->Preference->SQL Editor
に移動し、Safe Mode
オプションのチェックを外すことで、MySQL Workbench で無効にすることができます。
次に、MySQL サーバーを再起動し、上記のクエリを実行して、SELECT * FROM students;
を使用します。 コマンドを実行して、次の結果を取得します。
出力:
ID | Javaスコア | PythonScore |
---|---|---|
1 | 78 | 73 |
2 | 83 | 88 |
3 | 89 | 97 |
4 | 58 | 78 |
SELECT
と UNION ALL
を使用して、JOIN()
内のデータを収集します。 それが完了したら、JOIN()
を使用してすべてのデータを結合し、ID
属性のすべての条件を満たす条件で JavaScore
と PythonScore
を設定します。