5

在 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 值都是唯一的。如果我的解释不够清楚,这个答案应该解释得更好。然而,InnoDB 不遵循这种行为。事实上,InnoDB 甚至不允许您将 col2 作为主键定义中的第一个。

我的问题是,是否可以在不使用 MAX(id)+1 之类的方法的情况下以某种方式在 InnoDB 中对这种行为进行建模?我能找到的最接近的是this,但它适用于 PostgreSQL。

编辑:标题拼写错误

4

1 回答 1

1

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

由于 InnoDB 处理同时插入/更新,它必须在事务开始时保留数字。在事务回滚时,该数字仍然“使用”但未保存。因此,您的 MAX(id) 解决方案可能会给您带来麻烦。一个交易开始,号码被保留,你在一个单独的交易中拉出最高的“保存”号码+1,这与为第一个交易保留的相同。交易完成,保留号码现在被保存,与您的冲突。

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

于 2013-06-15T20:22:40.730 回答