在 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 LEVELseq_table 上的 UPDATESELECT 包装在事务中,以避免读取其他线程在您递增后递增的值。

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

【讨论】:

为了摆脱第一种方法中的多行,我们可以先删除所有行,然后再插入。

以上是关于在 mySQL 中是不是有整个数据库(不是每个表!)的自动增量?的主要内容,如果未能解决你的问题,请参考以下文章

查看整个 MySQL 数据库的所有外键约束

如何使用Excel VBA仅更新特定工作表中的链接,而不是整个工作簿?

如何在整个 MySQL 脚本上假设一个表前缀?

怎样备份mysql数据的一个表 而不是整个数据库

mysql新建表 中是不是自带描述字段?

从一个表复制到另一个表,如何对整个数据集而不是单独的行强制执行外键检查?