5

mySQL 中的所有表是否有适当的本机非解决方法自动递增可能性?我的意思是,不仅仅是每张表自动增加,我的意思是数据库中的每个新行都有一个数字?

我在专业的预言机(?)设置上看到了这一点。主要优点是您对所有表中的所有行/元素都有唯一的 id,而不仅仅是 PER TABLE。

4

1 回答 1

6

PostgreSQL 可以像这样在每次插入时使用 aCREATE SEQUENCE seq_name和 using进行设置。nextval(seq_name)

MySQL 对此没有本机支持,您可以通过创建一个只有一列和AUTO_INCREMENT该列上的表来模拟 PostgreSQL SEQUENCE 的行为。

您总是先插入该表,然后读取该LAST_INSERT_ID表的 id 以获取您需要插入到表中的 id。这将是交易安全的,因此不会产生重复。

实现此目的的另一种方法是创建一个表,其中一列没有AUTO_INCREMENT,只有一行保存当前最大值。

每次您需要递增时,您执行UPDATE seq_table SET seq_column = seq_colum+1;递增更新本身就是原子的,但是您还需要在之后读取值,这会产生两个语句并且它们不是原子的,除非您围绕它们设置事务和适当的隔离级别。这种方法可以节省空间,但也会生成锁定查询。

尝试的多个线程INSERT将不得不等待其他人更新,seq_table然后才能自己更新并读取新值。

此外,您还必须使用适当的方法UPDATE将 on 和SELECTon包装在事务中,以避免读取其他线程在您增加它后增加的值。seq_tableISOLATION LEVEL

这意味着这会INSERTS成为交易问题,但通常不会,所以我不推荐第二种方法。

于 2012-07-04T10:35:12.547 回答