1

我最近正在从 oracle 迁移到 mysql,如果我在 mysql 中实现类似于序列的东西是一个好方法,我想得到一些建议。

本质上,我目前将如何实现它是通过在 mysql 中为 oracle 中的每个序列创建一个单独的表,并有一个代表 last_number 的列,并在我插入新行时增加该列,这是我可以的另一种方式这样做是通过创建一个包含代表每个序列的几行的单个表,并在我进行插入时分别递增每一行。

另一种更简单的方法是,我可以在插入数据时在相关列上执行 select max()+1。

我基本上正在考虑切换到 select max()+1 选项,因为它似乎更易于实现,但我想就您认为从这些选项中实现它的最佳方法获得一些建议,如果使用 select max()+1 时,我目前不知道有什么陷阱。

另外我不使用 auto_increment 和函数 last_insert_id() 的原因是我想遵循 ansi 标准。

谢谢。

4

2 回答 2

2

首先:max()+1如果您使用高隔离级别的事务,则不保证该版本会给您一个序列。

我们通常使用序列的方式(如果我们无法避免它们)是创建一个带有AUTO_INCREMENT值的表,INSERT INTOSELECT last_insert_id(),,DELETE FROM table WHERE field<$LASTINSERTID。这当然是在存储过程中完成的。

于 2012-12-20T09:50:07.650 回答
1

存在读取一致性问题,因为两个会话都在运行......

insert into ... select max(..)+1 from ...

...同时两者都看到相同的 max(...) 值,因此它们都尝试插入相同的新值。

您的最大值表方法有同样的问题,您必须使用锁定机制来避免多个会话读取相同的值。这会导致并发问题,其中对表的插入是序列化的。

于 2012-12-20T09:45:25.947 回答