0

次の構文でテーブルを作成すると、

CREATE TABLE IF NOT EXISTS `hashes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` binary(20) NOT NULL,
PRIMARY KEY (`id`,`hash`),
UNIQUE KEY (`hash`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE = 4 AUTO_INCREMENT=1
PARTITION BY KEY(`hash`)
PARTITIONS 10;

そして、次の構文でクエリを挿入します

INSERT INTO hashes (hash) VALUES ($value) ON DUPLICATE KEY UPDATE hash = hash

その後、行が挿入または更新された場合、自動インクリメント列は期待どおりに機能します。

以下のようにパーティションなしでテーブルを作成し、上記のクエリを使用して挿入すると、更新または挿入のたびに自動インクリメント値が 1 増加しA_I、クエリが 10 回の更新を行ってから 1 回の挿入が行われるため、列があちこちに配置されます。 10位ジャンプする値。

CREATE TABLE IF NOT EXISTS `hashes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` binary(20) NOT NULL,
PRIMARY KEY (`id`,`hash`),
UNIQUE KEY (`hash`)
) ENGINE=InnoDB AUTO_INCREMENT=1;

更新時に値が増加する理由はINNO_DB理解できますが、テーブルが分割されている場合に増加しない理由はわかりませんか?

4

1 に答える 1

0

それを変更することはできませんが、次のようなことを試すことができます。

mysql> set @a:= (select max(id) + 2 from hashes); 

mysql> insert into hashes (id) values ($value) on duplicate key update id=@a;

注: パーティションは、mysql 5.6 の後で少し変更されます。どのバージョンを使用していますか?

于 2012-06-27T12:22:48.147 に答える