使用InnoDB中的自动增量行为模拟MyISAM的复合主键

时间:2013-06-15 12:03:04

标签: mysql database-design innodb myisam

在MySQL中,如果你有一个类似于:

的MyISAM表
CREATE TABLE `table1` (
`col1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`col2` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`col2`, `col1`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

如果插入行,则自动增量基数对于每个不同的col2值都是唯一的。如果我的解释不够明确,this答案应该更好地解释。但是,InnoDB不遵循这种行为。事实上,InnoDB甚至不会让你把col2放在主键定义的第一位。

我的问题是,是否有可能以某种方式在InnoDB中模拟这种行为而不诉诸MAX(id)+1或类似的方法?我能找到的最接近的是this,但它适用于PostgreSQL。

编辑:标题拼写错误

1 个答案:

答案 0 :(得分:1)

我之前使用的是MyISAM的一个简洁功能,但你不能用InnoDB做到这一点。 InnoDB确定启动时的最大数字,然后将数字保存在RAM中并在需要时递增。

由于InnoDB处理同时插入/更新,因此必须在事务开始时保留该数字。在事务回滚时,该数字仍然“已使用”但未保存。你的MAX(id)解决方案可能会让你陷入困境。事务开始,数字被保留,您在单独的事务中提取最高的“已保存”数字+ 1,这与为第一个事务保留的数字相同。交易结束,保留的号码现在已保存,与您的号码冲突。

MAX(id)返回最高保存数,而不是最高使用数。您可以拥有一个MyISAM表,其唯一目的是生成您想要的数字。它与MAX(id)解决方案的查询数量相同,只是一个是SELECT,另一个是INSERT。