由于开发规范禁止使用SEQUENCE,而且在shell脚本里面使用,于是有人想到用AUTO_RANDOM列产生唯一序列。
Temp表是临时表,包含AUTO_RANDOM列C1,生成随机数据后,会合并到Merge表,Merge表跟Temp表表结构一样,只是主键C1非AUTO_RANDOM,而是VARCHAR(32)。但是在批量里面会重复drop掉包含AUTO_RANDOM列的Temp表,于是,发现合并到总表Merge时候,出现了主键重复。
drop表主要是考虑到效率问题,试了一下truncate Temp表问题一样。(因为Tidb内部用新建表来实现Truncate)。
看了一下AUTO_RANDOM的实现方法,由于默认是AUTO_RANDOM(5,58)。5位sharding bit来自于TSO,很有可能会重复,而drop表或者truncate表后,58位随机位(实质上是自增)一旦重置,那么,N次插入Temp表后,就会发生5位sharding bit和58位自增位都相同的数据重复了。
这里想请教的问题是,不用sequence的情况下,数据库还有哪些工具可以产生非唯一的序列?
或者除了truncate,还有哪些高效delete数据的方法?
使用时间戳 + 随机数
另一种方式是结合时间戳和随机数。通过时间戳和一个随机数生成唯一的字符串,例如:
sqlCopy Code
SELECT CONCAT(DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'), '-', FLOOR(RAND() * 10000));
tso不会重复,取一个当做为一值
tso肯定不会重复,但是很少用数据库来做唯一吧,我公司都是代码层面去搞UUID或者雪花ID作为唯一值,再或者可以自定义,日期+时间+随机值。
这里想请教的问题是,不用sequence的情况下,数据库还有哪些工具可以产生非唯一的序列?
这里问的应该是产生唯一序列吧?
现在大多数的做法都是让代码里面实现一个雪花算法。自己生成这个id。
如果一定要数据库自己生成,那就是使用uuid。
https://docs.pingcap.com/zh/tidb/stable/uuid#uuid-最佳实践
merge表上这个字段还是varchar(32),感觉之前的设计目标这个字段就是uuid不带-。
AUTO_RANDOM是随机数,使用md5,guid