在 mySQL 中是不是有整个数据库(不是每个表!)的自动增量?
Posted
技术标签:
【中文标题】在 mySQL 中是不是有整个数据库(不是每个表!)的自动增量?【英文标题】:Is there auto increment over the full database (not each table!) in mySQL?在 mySQL 中是否有整个数据库(不是每个表!)的自动增量? 【发布时间】:2012-07-04 10:25:05 【问题描述】:mysql 中的所有表是否有适当的本机非解决方法自动递增可能性?我的意思是,不仅仅是每张表自动增加,我的意思是数据库中的每个新行都有一个数字?
我在专业的预言机 (?) 设置中看到了这一点。主要优点是您对所有表中的所有行/元素都有唯一的 id,而不仅仅是 PER TABLE。
【问题讨论】:
如果要保证唯一性,可以使用MySQL的UUID_SHORT()
函数。
MySQL 没有序列(与大多数其他 DBMS 一样)。您需要推出自己的解决方案。
我不知道原生方式。但也许您可以编写一个插入触发器,在所有表中搜索最高索引并返回该值。至少在理论上,老实说,我不确定这在 MySQL 中是否可行。
@acme 这将是 CPU 的可悲浪费。如果您只需要整体唯一性,请坚持使用 UUID。它们当然是 128 位的大值,所以如果你想使用更小的整数(BIGINT 是 64 位),那么请使用我描述的序列表。
@eggyal SHORT UUID 占用多大的空间?
【参考方案1】:
PostgreSQL 可以这样设置,使用CREATE SEQUENCE seq_name
并在每次插入时使用nextval(seq_name)
。
MySQL 没有对此的原生支持,您可以通过创建一个只有一列和该列上的 AUTO_INCREMENT
的表来模拟 PostgreSQL SEQUENCE 的行为。
您始终插入该表首先读取该表的LAST_INSERT_ID
以获取您需要插入到表中的 id。这将是交易安全的,因此不会产生重复。
实现此目的的另一种方法是创建一个表,其中一列没有AUTO_INCREMENT
,只有一行保存当前最大值。
每次您需要递增时,执行UPDATE seq_table SET seq_column = seq_colum+1;
时,递增更新本身就是原子的,但您还需要在之后读取值,这会产生两个语句并且它们不是原子的,除非您围绕它们设置事务和适当的隔离级别。这种方法可以节省空间,但也会生成锁定查询。
尝试INSERT
的多个线程必须等待其他人更新seq_table
,然后才能自行更新并读取新值。
此外,您还必须使用适当的 ISOLATION LEVEL
将 seq_table
上的 UPDATE
和 SELECT
包装在事务中,以避免读取其他线程在您递增后递增的值。
这意味着INSERTS
成为事务性问题,但通常不会,所以我不推荐第二种方法。
【讨论】:
为了摆脱第一种方法中的多行,我们可以先删除所有行,然后再插入。以上是关于在 mySQL 中是不是有整个数据库(不是每个表!)的自动增量?的主要内容,如果未能解决你的问题,请参考以下文章