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 列?
您可以使用如下所示的内容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”开始的连续数字,您可以使用上面的示例(相同的列),但使用以下内容SELECT(ROW_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)