1

我正在使用 luasql。我有两个这种类型的表:

IPINFO

CREATE TABLE `ipstats` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ip` VARCHAR(15) NOT NULL,
  `last_used` DATETIME NOT NULL DEFAULT '1981-09-30 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `ip` (`ip`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

和另一个表 ipnstats:

CREATE TABLE `ipnstats` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ipstats_id` INT(10) UNSIGNED NOT NULL,
  `nick` VARCHAR(32) NOT NULL,
  `used_times` INT(10) UNSIGNED NOT NULL,
  `last_used` DATETIME NOT NULL DEFAULT '1981-09-30 00:00:00',
  PRIMARY KEY (`id`),
  INDEX `ipstats_id` (`ipstats_id`),
  INDEX `nick` (`nick`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

现在,我在这里想要实现的是,在我的ipnstats表中, IFF 的值used_times将被更新(当且仅当)表中的索引(nicknameipstats_id)都匹配。我的插入/更新命令是这样的:

INSERT INTO `ipstats_nicks` (`ipstats_id`, `nick`, `last_used`) 
  VALUES ( %d, '%s', '%s' ) 
  ON DUPLICATE KEY 
  UPDATE `last_used` = '%s', `used_times` = `used_times`+1

然后我使用变量格式化这个字符串。但这并没有给我表格中所需的更新。它只是继续将数据插入表中。

任何帮助表示赞赏。

4

1 回答 1

1

有两个问题:

  1. ON DUPLICATE KEY UPDATE仅适用于UNIQUE索引。您的索引不是唯一的。
  2. 如果任何单个索引产生冲突,它将执行更新。没有办法告诉它只在两个索引有冲突时才执行更新。

也许您真正想要的是一个唯一的多列索引?

UNIQUE INDEX `ipstats_id_nick` (`ipstats_id`, `nick`)
于 2012-06-23T17:03:13.287 回答