私はINSERT ... ON DUPLICATE KEY UPDATE
しかし、更新部分が条件付きである必要があり、追加条件が変更された場合にのみ更新を行います。
ただし、WHERE
はこのUPDATE
では許可されません。これに対する回避策はありますか?
INSERT/UPDATE/SELECTを組み合わせて実行することはできません。これは、レプリケーションを処理する必要があるためです。
IF()を使用してそれを行うことをお勧めします。
参照: conditional-duplicate-key-updates-with-mysql
INSERT INTO daily_events (created_on, last_event_id, last_event_created_at)
VALUES ('2010-01-19', 23, '2010-01-19 10:23:11')
ON DUPLICATE KEY UPDATE
last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id);
これが最終的な解決策であり、魅力のように機能します!
insert ignoreは、マスターとスレーブが迂回した場合に備えて、マスターとスレーブの両方に行が存在することを確認します。
pdate ... whereは、すべての複製が行われた後、グローバルに最新の更新のみが最終結果であることを確認します。
mysql> desc test;
+-------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | NULL | |
| value | varchar(255) | YES | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+--------------+------+-----+-------------------+-------+
mysql> insert ignore into test values (4, "foo", now());
mysql> update test set value = "foo", ts = now() where id = 4 and ts <= now();
ソースデータの選択部分にwhere句を追加できるため、2つのinsertステートメントを使用できます。
2つのデータセットを選択します。1つは「複製時に」挿入し、もう1つは「複製時に」挿入せずに挿入します。
ON DUPLICATE KEY UPDATE
_の条件付きWHERE句をサポートしませんIF()
関数で条件節をサポートします_INSERT INTO zzdemo_table02
(lname,userid)
SELECT
lname,userid
FROM(
SELECT
lname,userid
FROM
zzdemo_table01
) as tt01
ON DUPLICATE KEY UPDATE
userid=IF(@doupdate:=IF( (tt01.userid < 9) , True, False),
tt01.userid, zzdemo_table02.userid)
,lname=IF(@doupdate, tt01.lname , zzdemo_table02.lname )
;
_
@doupdate
_を導入します。次に、UPDATEステートメントで使用するすべてのデータベース列に同じ変数を使用しますテーブル
php_lock
:name
:idString、locked
:bool、time
:timestamp、locked_by
:ストリング
挿入または更新する値
1、CURRENT_TIMESTAMP、 'script'
wherename
= 'wwww' ANDlocked
= 2
INSERT INTO `php_lock` (`name`, locked, `time`, `locked_by`)
(SELECT * FROM
(SELECT `name`,1,CURRENT_TIMESTAMP, 'script' FROM `php_lock`
WHERE `name`='wwww' AND `locked`=2
UNION (
SELECT 'wwww',1 ,CURRENT_TIMESTAMP, 'script')
) AS temp LIMIT 1)
ON DUPLICATE KEY UPDATE locked=VALUES(locked), `time`=VALUES(`time`), `locked_by`=VALUES(`locked_by`);