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 回答