生成一个6位数的自动生成的数字

时间:2019-02-21 12:12:01

标签: mysql

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

SELECT concat('TZ',YEAR(CURDATE()),FLOOR(RAND() * 999999.99)) as ID , animalid FROM adggeth.view_allanimals;

以下查询的输出是

# ID, animalid
'TZ2019703169', 'TZN000044001722'
'TZ2019914906', 'TZN000067976797'
'TZ2019465022', 'TZN000094299429'
'TZ2019580395', 'TZN000192792688'

我的预期输出

# ID, animalid
'TZ2019000001', 'TZN000044001722'
'TZ2019000002', 'TZN000067976797'
'TZ2019000003', 'TZN000094299429'
'TZ2019000004', 'TZN000192792688'

如何为我的ID生成一个随机数以实现预期的输出

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

使用

CONCAT('TZ', YEAR(CURDATE()), LPAD(@seq, 6, '0'))

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

1 个答案:

答案 0 :(得分:1)

您似乎希望ID为TZYYYYNNNNNN格式,其中YYYY是本年度,而NNNNNN是有保证的序号。在这里,您将询问如何以保证唯一的方式生成序列号。

如果您使用的是Oracle,则可以使用sequence对象。但是谁能负担得起Oracle?

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

创建下表:

 CREATE TABLE sequence (
     sequence_id BIGINT NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`sequence_id`)
) 

然后,每次您需要一个新的序列号时,依次发出这三个查询:

INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SET @seq := LAST_INSERT_ID();

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

拥有@seq之后,您就可以使用它来生成您的ID值,诸如此类。

CONCAT('TZ', YEAR(CURDATE()), LPAD(@seq, 6, '0'))

要在明年第一天重设序列号,只需删除并重新创建sequence表即可。