如何根据不同的id类别生成唯一ID?

时间:2017-10-02 06:36:45

标签: mysql

我有一张如下所示的表格

| id         | name        | doc_no       |
|:-----------|------------:|:------------:|
| 1          | abc         |     D11710001
| 2          | efg         |     D21710001
| 3          | hij         |     D31710001
| 4          | klm         |     D41710001
| 5          | nop         |     D51710001
| 1          | qrs         |     D11710002

我想基于给定的id生成唯一ID。例如,当我将项目存储在此表中时,它将根据表格的id生成唯一ID。

注意:此表中的id是外键。用户可以手动将doc no修改为自己的格式。

ID格式 - D' id' '一年' '当月' 0001(自动增量)

如何编写sql以在存储数据期间生成唯一ID?

2 个答案:

答案 0 :(得分:1)

继续@strawberry的评论我可能会建议将ID存储在您的数据库中。除了在插入记录的同时访问自动增量ID这一事实可能很棘手,存储此生成的ID将复制已存储在表中其他位置的信息。您可以在查询时生成ID,而不是存储您的ID,例如

SELECT
    id, name, doc_no,
    CONCAT('D', id, STR_TO_DATE(date, '%Y-%m'), auto_id) AS unique_id
FROM yourTable;

这假定您将每个记录的插入日期存储在名为date的日期列中。它还假定您的表有一个名为auto_id的自动增量列。请注意,存储插入日期可能对您有用,例如:如果您想根据日期或时间在表格中搜索数据。

答案 1 :(得分:0)

您可以创建触发器并更新列,也可以在INSERT

之后写下更新状态
insert into <YOUR_TABLE>(NAME,DOC_NO) values('hello','dummy');

update <YOUR_TABLE> set DOC_NO=CONCAT('D',
                            CAST(YEAR(NOW()) AS CHAR(4)),
                            CAST(MONTH(NOW()) AS CHAR(4)),
                            LAST_INSERT_ID()) 
WHERE id=LAST_INSERT_ID();

请注意,如上所述SQL可能会导致竞争条件,同时服务器会收到多个请求。

@Tim Biegeleisen有一个很好的观点,因为当你SELECT数据时构建id会更好。