如果一对匹配,就更新单元格值。

我正在使用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表中,只有当表中的两个索引(nicknameipstats_id)匹配时,used_times的值才会更新。我的插入/更新命令如下:

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

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

任何帮助将不胜感激。

点赞
用户61974
用户61974

有两个问题:

  1. ON DUPLICATE KEY UPDATE 只适用于 唯一性 索引,而你的索引不唯一。
  2. 如果任何一个索引发生冲突,它都会执行更新。无法告诉它只在两个索引冲突时才执行更新。

也许你真正需要的是一个单一的唯一多列索引吗?

UNIQUE INDEX `ipstats_id_nick` (`ipstats_id`, `nick`)
2012-06-23 17:03:13