首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成自动生成的6位数字

生成自动生成的6位数字
EN

Stack Overflow用户
提问于 2019-02-21 20:12:01
回答 1查看 35关注 0票数 0

我正在为我的动物生成新的i,并运行以下查询

代码语言:javascript
复制
SELECT concat('TZ',YEAR(CURDATE()),FLOOR(RAND() * 999999.99)) as ID , animalid FROM adggeth.view_allanimals;

我对以下查询的输出是

代码语言:javascript
复制
# ID, animalid
'TZ2019703169', 'TZN000044001722'
'TZ2019914906', 'TZN000067976797'
'TZ2019465022', 'TZN000094299429'
'TZ2019580395', 'TZN000192792688'

我的预期输出

代码语言:javascript
复制
# ID, animalid
'TZ2019000001', 'TZN000044001722'
'TZ2019000002', 'TZN000067976797'
'TZ2019000003', 'TZN000094299429'
'TZ2019000004', 'TZN000192792688'

如何为我的id生成一个随机数来实现预期的输出?

更改后,我得到以下意外错误

使用

代码语言:javascript
复制
CONCAT('TZ', YEAR(CURDATE()), LPAD(@seq, 6, '0'))

'TZ2019000001', 'TZN000044001722'
'TZ2019000001', 'TZN000067976797'
'TZ2019000001', 'TZN000094299429'
'TZ2019000001', 'TZN000192792688'
EN

回答 1

Stack Overflow用户

发布于 2019-02-21 20:29:35

看起来您需要TZYYYYNNNNNN格式的is,其中YYYY是当前年份,NNNNNN是保证的序列号。在这里,您询问如何以一种保证唯一的方式生成序列号。

如果您使用的是Oracle,则可以使用sequence对象。但是谁能买得起甲骨文呢?

因此,您需要在MySQL中模拟序列对象。这有点令人讨厌,但我们开始吧:

创建下表:

代码语言:javascript
复制
 CREATE TABLE sequence (
     sequence_id BIGINT NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`sequence_id`)
) 

然后,每次需要新的序列号时执行,依次发出以下三个查询:

代码语言:javascript
复制
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SET @seq := LAST_INSERT_ID();

第三行将一个保证唯一的数字放入@seq变量。即使你有几十个不同的客户端程序连接到你的数据库,生成序列号,这个保证也是有效的。( DELETE查询只是防止这个原本毫无意义的表占用太多空间。)

一旦你有了@seq,你就可以用它来生成你的id值,就像这样。

代码语言:javascript
复制
CONCAT('TZ', YEAR(CURDATE()), LPAD(@seq, 6, '0'))

要在第二年的第一天重置序列号,只需删除并重新创建sequence表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54806783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档