INSERT … НА ОБНОВЛЕНИИ КЛЮЧА DUPLICATE с ГДЕ?

Я делаю INSERT ... ON DUPLICATE KEY UPDATE но мне нужно, чтобы часть обновления была условной, только выполняющая обновление, если какое-то дополнительное условие изменилось.

Однако в этом UPDATE не допускается WHERE . Есть ли обходной путь для этого?

Я не могу делать комбинации INSERT / UPDATE / SELECT, так как это необходимо для работы над репликацией.

    Я предлагаю вам использовать IF () для этого.

    См. Условный-дубликат-ключ-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); 

    Это наше окончательное решение, работает как шарм!

    Вставка игнорируется , убедитесь, что строка существует как на главном, так и на ведомом устройстве, если они когда-либо отвлекались.

    Обновление … где гарантирует, что только последнее обновление во всем мире является конечным результатом после завершения всей репликации.

     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 к части выбора для исходных данных.

    выберите два набора данных, которые вы будете вставлять с помощью «on duplicate», а другой будет вставлен без дубликата.

    таблица php_lock :
    name : idString, locked : bool, time : timestamp, locked_by : string
    значения для вставки или обновления
    1, CURRENT_TIMESTAMP, ‘script’
    где name = ‘wwww’ AND locked = 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`); 

    On duplicate key мы не можем использовать предложение where, поэтому есть две альтернативы для достижения того же.

    1. Если вы знаете, что большую часть времени вы получите дублирующий ключ, тогда

      a. Update the table first using update query and where clause b. If update fails then insert the record into table using insert query

    2. Если вы знаете, что большую часть времени вы собираетесь вставлять в таблицу, тогда

      a. Insert the record into table using insert ignore query - what it does is actually ignore the insert if duplicate key found b. If insert ignore fails then update the record using update query

    Для справки insert ignore нажмите здесь

     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), last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at); 
    Давайте будем гением компьютера.