Правильный запрос

283
23 декабря 2017, 03:14

Продолжение данной темы! Есть таблица:

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

Answer 1

вам необходимо полностью сформировать 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

READ ALSO
SQL. Вопросы оптимизации

SQL. Вопросы оптимизации

Доброго времени суток

243
ASP NET как задать язык ресурсов

ASP NET как задать язык ресурсов

Как програмно задать язык ресурсов в ASP?

221