我正在为我的动物生成新的i,并运行以下查询
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'发布于 2019-02-21 20:29:35
看起来您需要TZYYYYNNNNNN格式的is,其中YYYY是当前年份,NNNNNN是保证的序列号。在这里,您询问如何以一种保证唯一的方式生成序列号。
如果您使用的是Oracle,则可以使用sequence对象。但是谁能买得起甲骨文呢?
因此,您需要在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表。
https://stackoverflow.com/questions/54806783
复制相似问题