MySQL 如何创建带有日期格式的自定义 id 列?

Lea*_*ev. 5 mysql

MySQL 当前表

CREATE TABLE document_control (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT...
Run Code Online (Sandbox Code Playgroud)

从上面 -id将按以下顺序创建:1,2,3,4,5,6,7...

意图

我需要这样的顺序:

19-001
19-002
19-003
Run Code Online (Sandbox Code Playgroud)

解释

19- 今天的年份日期格式 (yy)

001- 添加新值时增加+1。

明年(2020年)..

序列需要重置回,001但由于年份是 2020,因此 19 更改为 20:

20-001
20-002
20-003
Run Code Online (Sandbox Code Playgroud)

问题

如何创建这个自定义 ID 列?

Seb*_*sch 4

您可以使用如下所示的内容INSERT ... SELECT

INSERT INTO document_control 
  SELECT CONCAT_WS('-', RIGHT(YEAR(CURRENT_TIMESTAMP), 2), LPAD(COUNT(*) + 1, 3, 0)) 
  FROM document_control
  WHERE LEFT(id_custom, 2) = RIGHT(YEAR(CURRENT_TIMESTAMP), 2)
Run Code Online (Sandbox Code Playgroud)

注意:使用此类生成的自定义 ID 作为特定记录的标识符可能很危险,因为自定义 ID 可能会在更改表的数据(UPDATE或)后发生更改。DELETE所以我不建议在其他表上使用这个自定义ID作为外键。


更好的解决方案(在我看来)如下:

CREATE TABLE document_control (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  name VARCHAR(10)
);
Run Code Online (Sandbox Code Playgroud)

您使用的表中的列id使用自动增量(因此数据库自行组织 ID),并且该created_at列存储创建的日期和时间。您可以使用CURRENT_TIMESTAMP默认值,这样您就不必INSERT每次都提供值。通过这两列,您可以通过简单的查询获取自定义 ID:

SELECT *, CONCAT_WS('-', RIGHT(YEAR(created_at), 2), LPAD(id, 3, 0)) AS custom_id 
FROM document_control
Run Code Online (Sandbox Code Playgroud)

您可以创建一个VIEW在后台生成自定义 ID。在这种情况下,您不必SELECT自己构建自定义 ID:

-- create the VIEW
CREATE VIEW v_document_control AS
  SELECT *, CONCAT_WS('-', RIGHT(YEAR(created_at), 2), LPAD(id, 3, 0)) AS custom_id 
  FROM document_control

-- use the VIEW
SELECT * FROM v_document_control
Run Code Online (Sandbox Code Playgroud)

如果您需要一个没有间隙且每年从“1”开始的连续数字,您可以使用上面的示例(相同的列),但使用以下内容SELECTROW_NUMBER自 MySQL 8.0 起):

SELECT *, CONCAT_WS('-', RIGHT(YEAR(created_at), 2), LPAD(ROW_NUMBER() OVER (PARTITION BY YEAR(created_at) ORDER BY id), 3, 0)) AS custom_id 
FROM document_control
Run Code Online (Sandbox Code Playgroud)

dbfiddle.uk 上的演示