Я пытаюсь вставить новую строку, но если ключ уже существует, я хочу обновить строку ТОЛЬКО, если другое значение в таблице отличается. Возможно ли это в запросе/заявлении mysql?
Моя таблица состоит из следующих столбцов: hat, mittens, name, last_update
hat + рукавицы составляют уникальный индекс (скажем, значения для "шляп" и "варежки" являются цветами)
Предположим, что это уже находится в таблице:
1. hat=blue mittens=green name=george last_update=tuesday 2. hat=red mittens=green name=bill last_update=monday
На новом ключе я хочу вставить как обычно. В двойном ключе, я хочу делать обновление ТОЛЬКО, если имя изменяется, иначе игнорируется. Причина этого в том, что я хочу сохранить значение last_update (метка времени).
hat=yellow mittens=purple name=jimmy -- insert new row hat=blue mittens=green name=george -- ignore hat=blue mittens=green name=betty -- update row
Возможно ли, что без использования отдельных операторов сначала просмотреть существующую строку, сравнить значения и затем, если необходимо, выдать обновление? Если да, то какой будет синтаксис?
Спасибо за ваши ответы. Я попробовал их всех. Действительно, используя простой оператор UPDATE, например
update tbl set name='george' where hat='blue' and mittens='green'
не приводит к обновлению строк. Но, используя либо
INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
или
INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
каким-то образом приводит к обновлению строки (и изменилась метка времени).
FWIW, это таблица, которую я использую:
CREATE TABLE `tbl` (
`hat` varchar(11) default NULL,
`mittens` varchar(11) default NULL,
`name` varchar(11) default NULL,
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `clothes` (`hat`,`mittens`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
MySQL - это версия 4.1.22 (возможно, это имеет значение?) Опять же, моя оценка за все ответы.