1

luasql を使用しています。このタイプのテーブルが 2 つあります。

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、私のテーブルで の値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

2 つの問題があります。

  1. ON DUPLICATE KEY UPDATEUNIQUEインデックスでのみ機能します。インデックスが一意ではありません。
  2. 1 つのインデックスで競合が発生した場合は、更新が実行されます。両方のインデックスが競合している場合にのみ更新を実行するように指示する方法はありません。

おそらく、本当に必要なのは、単一の一意の複数列インデックスですか?

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