继续这个话题!这里有张桌子:
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 帮助
您需要通过指定所有值来完全形成插入。实际上,在更新中,您只需要指定唯一键中未包含的字段
该请求将检测到存在具有一组唯一关键组件的字段,在这种情况下将更改时间戳。但是必须为请求提供所有值,以防没有这样的字段。而且,这些值可以不同。经典选项 - 计数器
INSERT INTO table (id, count) ($id, 0) ON DUPLICATE KEY UPDATE count = count+1