新しい行を挿入せずに、一意のキーで識別される複数の行を更新したい。
以下は私のテーブルです:
CREATE TABLE `insert_update_ignore` (
`obj_id` int(11) NOT NULL,
`obj_type` tinyint(4) NOT NULL,
`value` int(11) DEFAULT '-1',
UNIQUE KEY `unique_key` (`obj_id`,`obj_type`))
ENGINE=InnoDB DEFAULT CHARSET=utf8
テーブルには既存のレコードがいくつかあります。
mysql> select * from insert_update_ignore;
+--------+----------+-------+
| obj_id | obj_type | value |
+--------+----------+-------+
| 1 | 1 | -1 |
| 1 | 2 | -1 |
| 2 | 1 | -1 |
| 2 | 2 | -1 |
+--------+----------+-------+
value
テーブルの列を更新する値がいくつかあります。
INSERT INTO insert_update_ignore(obj_id, obj_type, value)
VALUES(1, 1, 1),
(1, 2, 3),
(2, 1, 1),
(2, 2, 5),
(3, 1, 10)
ON DUPLICATE KEY UPDATE
value = VALUES(value);
これは、最後の値、つまり (3, 1, 10) がテーブルに挿入されることを除いて、ほぼ完了です。一意のキー (3, 1) は以前に存在しないため、これを挿入しないでください。
どうすればそのUPDATE
部分を行うことができますが、できませんINSERT
か? より適切な実装が存在する場合は、テーブル スキーマを変更できます。更新される値は、他のデータベース (別のマシンおよび別のポートで実行されている) から計算されます。
以下のものを掘り出して仕事をしますが、値が数千の場合、ステートメントは大きすぎます。これを行うためのよりエレガントな方法はありますか? 誰かがこれについて助けることができればありがとう。PSこれをPythonでコーディングし、MySQLdbライブラリを使用しています。
UPDATE insert_update_ignore
SET value = CASE
WHEN (obj_id = 1 AND obj_type = 1) THEN 1
WHEN (obj_id = 1 AND obj_type = 2) THEN 3
WHEN (obj_id = 2 AND obj_type = 1) THEN 1
WHEN (obj_id = 2 AND obj_type = 2) THEN 5
WHEN (obj_id = 3 AND obj_type = 1) THEN 10
ELSE value
END
WHERE (obj_id, obj_type) IN ((1, 1), (1,2), (2, 1), (2, 2), (3, 1));