自定义自动增量列

时间:2017-12-26 08:17:08

标签: mysql database

我正在制作一个C#项目,我需要帮助来生成和插入MySQL数据库中的字段。

161013001

其中:
16是年,
10是月,
13是天 和001是每天重置的自动递增数字。

例如

161012-001
161012-002
161012-002
161013-001
161013-002
161014-001
161014-002
161014-003
161014-004
161014-005
161015-001

请指导我如何使ID每天重置并从每天1开始。

2 个答案:

答案 0 :(得分:1)

此处同时添加了MySQL和SQL Server实现,

MySQL:

DROP TEMPORARY TABLE TempDate;
CREATE TEMPORARY TABLE TempDate(
Id VARCHAR(50),
Comments  VARCHAR(50)
);
INSERT INTO TempDate(Id,Comments)
SELECT '190630-001', '1'
UNION 
SELECT '190630-002', '2'
UNION 
SELECT '190701-001', '1'
UNION 
SELECT '190701-002', '2'
UNION 
SELECT '190701-003', '3';

SET @v_ToDay = '';
SET @v_ToDay = (SELECT date_format(current_date(),'%y%m%d'));
SET @v_TotalByDay  = '' ;

SET @v_TotalByDay =(
SELECT CONCAT('000',CAST(CASE WHEN COUNT(1) = 0 THEN 1 ELSE COUNT(1)+1 END as CHAR))
FROM TempDate
WHERE LEFT(Id,6) = @v_ToDay);

SELECT CONCAT(@v_ToDay, '-', CASE WHEN CHAR_LENGTH(RTRIM(@v_TotalByDay)) > 3 THEN RIGHT(@v_TotalByDay,3) ELSE @v_TotalByDay END) as NewIdColumn

SQL Server:

DECLARE @TempDate TABLE(
Id NVARCHAR(50),
Comments  NVARCHAR(MAX)
)

INSERT INTO @TempDate(Id,Comments)
SELECT '190630-001', '1'
UNION 
SELECT '190630-002', '2'
UNION 
SELECT '190701-001', '1'
UNION 
SELECT '190701-002', '2'
UNION 
SELECT '190701-003', '3'

DECLARE @ToDay NVARCHAR(20) = (SELECT  CONVERT(NVARCHAR(6), GETDATE(), 12))
DECLARE @TotalByDay NVARCHAR(20) = '' 

SELECT @TotalByDay = '000' + CAST(CASE WHEN COUNT(1) = 0 THEN 1 ELSE COUNT(1)+1 END as NVARCHAR(20) )
FROM @TempDate
WHERE LEFT(Id,6) = @ToDay

SELECT @ToDay + '-' + CASE WHEN LEN(@TotalByDay) > 3 THEN RIGHT(@TotalByDay,3) ELSE @TotalByDay END as NewIdColumn

答案 1 :(得分:0)

我的情况与这个问题稍有不同....

  

我有一个旧数据库(不是仅用于报告操作的数据库)   目的..)

     该数据库事务表中的

是一个自动增量tranx id列。   像1,2,3 ......但是现在我们的新报告需要有意义的tranx id   (yyMMDD<count of that day>)喜欢这个问题。所以实际上我需要一个   选择查询来解决此问题。

借助@Khairul的逻辑,我解决了我的问题....

我分享了我对他人帮助的解决方案。...

  SELECT
trnx_id, account_id, pay_amount,counter_id, trantime, trandate
FROM(
SELECT 
    @id:=IF(@prev != t.trandate, @rownum:=1, @rownum:=@rownum+1)
    ,@prev:=t.trandate 
    ,CONCAT(
        SUBSTR(YEAR(t.`trandate`),3) -- year
        ,IF(LENGTH(MONTH(t.`trandate`))=1,CONCAT('0',MONTH(t.`trandate`)),MONTH(t.`trandate`)) -- month
        ,IF(LENGTH(DAY(t.`trandate`))=1,CONCAT('0',DAY(t.`trandate`)),DAY(t.`trandate`)) -- day 
        ,IF(LENGTH(@id)=1,CONCAT('000',@id),IF(LENGTH(@id)=2,CONCAT('00',@id),IF(LENGTH(@id)=3,CONCAT('0',@id),@id))) -- count 
    ) AS trnx_id 
    ,t.* 
FROM tax_info t ORDER BY t.`trandate`, t.`trantime`


) AS te

我的查询结果是..........

enter image description here


解决我的问题后,我尝试解决此问题....... 为此,我将触发器用于输入自动增量自定义列... 我的代码在下面,我的付款列中有一个自定义的tranx ID ....

DELIMITER $$ 

DROP TRIGGER  tranxidGeneration$$

CREATE 
    TRIGGER tranxidGeneration BEFORE INSERT ON payment 
    FOR EACH ROW BEGIN 

    DECLARE v_tranx_id_on INT; 

    -- count total row of that day
    select IFNULL(COUNT(tranx_id),0)+1 Into v_tranx_id_on from payment where SUBSTR(tranx_id,1,6) = DATE_FORMAT(NOW(), "%y%m%d");

    -- set custom generate id into tranx_id column 
    SET NEW.tranx_id := CONCAT(DATE_FORMAT(NOW(), "%y%m%d"),LPAD(v_tranx_id_on,4,0)) ; 

    END;
$$ 
DELIMITER ;