【问题标题】:Generating an auto generated number with 6 digits生成一个自动生成的 6 位数字
【发布时间】:2019-02-21 12:12:00
【问题描述】:

我正在为我的动物生成新 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'

【问题讨论】:

  • 你想要序号?
  • 随机是随机的,它不能保证唯一性..
  • 是的,我愿意@SalmanA
  • 我认为您将数据库内部使用的 id 与公共 id 混淆了。将内部 id 存储为 AI id。
  • @MirieriMogaka mybe stackoverflow.com/questions/14298154/… 帮助

标签: mysql


【解决方案1】:

您似乎需要格式为 TZYYYYNNNNNN 的 ID,其中 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 表即可。

【讨论】:

  • @seq 并不神奇。每次需要一个新值时,您都必须获得一个新值。查看我的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多