你可以使用 SQL 中的字符串拼接和日期函数来生成你所需的格式。根据你的要求,格式是:
- 1、`I_` :固定前缀。
- 2、 `YYYYMMDDHHMMSS` :精确到秒的时间。
- 3、 `_` :下划线分隔符。
- 4、 `0000001` :第几个入库,按序号递增,左边补齐为 7 位数。
以下是一个实现你需求的 SQL 语句示例
1. 创建表
假设你有一个入库记录的表 `inventory_in`, 用于存储每条入库的唯一标识:
CREATE TABLE inventory_in (
id INT AUTO_INCREMENT PRIMARY KEY,
unique_code VARCHAR(50) NOT NULL
);
2. 插入数据并生成特殊格式的唯一编码
每次插入数据时,你可以使用 `NOW()` 函数来获取当前时间,并使用 `LPAD()` 函数来格式化入库的序号。可以结合 `DATE_FORMAT()` 和 `CONCAT()` 来拼接成符合你需求的格式:
INSERT INTO inventory_in (unique_code)
SELECT CONCAT(
'I_', -- 固定前缀
DATE_FORMAT(NOW(), '%Y%m%d%H%i%S'), -- 当前时间,格式为 YYYYMMDDHHMMSS
'_',
LPAD(IFNULL(MAX(id), 0) + 1, 7, '0') -- 第几个入库,左补0,7位长
)
FROM inventory_in;
解释:
1. `DATE_FORMAT(NOW(), '%Y%m%d%H%i%S')`:获取当前时间,格式化为 `YYYYMMDDHHMMSS`。
2. `LPAD(IFNULL(MAX(id), 0) + 1, 7, '0')`:获取表中当前的最大 `id` 值,加 `1`,并用 `LPAD` 补齐为 7 位数(假设每条记录都有一个递增的 `id`)。
3. `CONCAT('I_', DATE_FORMAT(...) ...)`:将所有部分拼接在一起,生成符合要求的唯一编码。
3、示例生成的结果
假设当前的最大 `id` 为 `5`,时间为 `2024年9月1日22时8分46秒`,那么生成的唯一编码将会是:
I_20240901220846_0000006
注意事项:
如果你有并发插入操作的场景,建议加锁,或者将序列号放到其他表中管理,以确保序号的唯一性和连续性。
`MAX(id)` 可能在大数据量的情况下性能较低,可以使用其它方式管理序列号。