2013-10-23 148 views
0

如何创建一个自动增量字段基于这个例子:自动递增的MySQL触发

我有这样的表,用“AF”字段,该格式:SN.MM.YYYY 的“SN” = AI号基于最后一次插入,MM =月份,YYYY =年度。

| ID | AF  | 
____________________ 
| 1 | 01.10.2013 | 
| 2 | 02.10.2013 | 

所以,当一个月或一年的变化,触发必须设置“AF”字段的方法: 例:月变化十一月(复位SN到01)。

| 3 | 01.11.2013 | 
| 4 | 02.11.2013 | 

同样的事情时的增减幅度(复位SN 01):

| 5 | 01.01.2014 | 
| 6 | 02.01.2014 | 
| 7 | 03.01.2014 | 

任何人都知道是如何设置的触发?

观测数据:有可能会超过在一天一个记录,所以,天并不重要。

对不起,我的英文不好

谢谢你们!

+0

所以不是你列一个简单的仿真'DD.MM.YYYY'格式的日期? –

+1

没有基于日期的触发,但插入更新和删除,但我认为你不想追加ID至今,因为它已如果你告诉你想要什么 –

+0

@AlmaDoMundo你行的一部分。它的好:不,不是日期值... SN是同一月份和年份中每个插页的序列号。 –

回答

1

从技术上讲,你可以做这样的事情

CREATE TRIGGER tg_bi_table1 
BEFORE INSERT ON table1 
FOR EACH ROW 
    SET NEW.af = CONCAT(
    LPAD(COALESCE(
     (SELECT MAX(LEFT(af, 2)) 
     FROM table1 
     WHERE af LIKE DATE_FORMAT(CURDATE(), '__.%m.%Y')), 0) + 1, 2, '0'), 
    DATE_FORMAT(CURDATE(), '.%m.%Y')); 

下面是SQLFiddle演示

注:这种做法(这样的模式建立自己的ago_increment值)有两个主要缺点:

  1. 在繁重的并发访问不同的连接可以得到相同的AF数
  2. 因为你的特殊AF模式(SN至上)使用索引是不可能的,因此,你会最终总是得到一个完整的扫描
+0

工作,谢谢! –