Продолжение данной темы! Есть таблица:
CREATE TABLE IF NOT EXISTS `TABLE_KITS_LOG` (
`FIELD_SERVER_ID` varchar(64) COLLATE utf8_unicode_ci,
`FIELD_PLAYER` varchar(64) COLLATE utf8_unicode_ci,
`FIELD_KIT_NAME` varchar(64) COLLATE utf8_unicode_ci,
`FIELD_TIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Для неё есть индекс:
CREATE unique index TABLE_KITS_LOG_INDEX on TABLE_KITS_LOG(
FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME);
К примеру в таблице есть след записи:
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("rpg", "name", "deluxe");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("rpg", "name", "mods");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("rpg", "name", "vip");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("classic", "name", "deluxe");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("classic", "name", "mods");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("classic", "name", "vip");
Так как изменение требует только поле FIELD_TIMESTAMP
я пытаюсь сделать запрос, который с помощью уникального индекса и настройки таблицы сам обновит это поле, ибо при создании таблице я указываю default
значение и значение при обновление CURRENT_TIMESTAMP
.
Так как я указал, что при обновлении записи колонка FIELD_TIMESTAMP
должна сама обновится, то я не знаю что писать после KEY UPDATE
, в варианте который ниже пишется ошибка: Error Code: 1136. Column count doesn't match value count at row 1
. Нужно учесть, что если записи нет, то её нужно вставить, а если есть - обновить время.
Попытка сделать нужный запрос:
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME, FIELD_TIMESTAMP) VALUES ("rpg", "name", "mods")
ON DUPLICATE KEY UPDATE FIELD_TIMESTAMP = CURRENT_TIMESTAMP;
@Akina help
вам необходимо полностью сформировать insert, указав все значения. А в update, действительно, нужно указать только поля, не входящие в уникальный ключ
INSERT INTO `TABLE_KITS_LOG`
(FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME, FIELD_TIMESTAMP) VALUES
("rpg", "name", "mods", CURRENT_TIMESTAMP)
ON DUPLICATE KEY UPDATE FIELD_TIMESTAMP = CURRENT_TIMESTAMP;
запрос обнаружит что поле с набором составляющих уникальный ключ существует и в этом случае поменяет timestap. Но запросу надо дать все значения, на случай если такого поля нет. Тем более, что эти значения могут быть разные. Классический вариант - счетчик INSERT INTO table (id, count) ($id, 0) ON DUPLICATE KEY UPDATE count = count+1
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?