我正在为动物生成新的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'
答案 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
表即可。