【问题标题】:Auto Increment mysql trigger自动增量mysql触发器
【发布时间】:2013-10-23 14:02:15
【问题描述】:

如何根据本例创建自增字段:

我有这张表,带有“AF”字段,格式为:SN.MM.YYYY “SN” = 基于上次插入的 AI 编号,MM = 每年,YYYY = 每年。

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

因此,当更改月份或年份时,触发器必须以这种方式设置“AF”字段: 例如:月份更改为 11 月(将 SN 重置为 01)。

|  3 | 01.11.2013  |
|  4 | 02.11.2013  |

年份变化时同样的事情(将SN重置为01):

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

有人知道那个触发器是怎么设置的吗?

Obs:一天内可能有不止一条记录,所以,日子并不重要。

抱歉英语不好

谢谢大家!

【问题讨论】:

  • 那么您的专栏不是DD.MM.YYYY 格式的简单日期模拟吗?
  • 没有基于日期的触发器,但插入更新和删除,但我认为你不想将 id 附加到日期,因为它已经是你行的一部分。如果你告诉你到底想要什么,那就太好了跨度>
  • @AlmaDoMundo:不,不是日值... SN 是同一月份和同一年中每个插入的序列号。
  • @MarceloAymone 但天 年+月内的序号 - 即,由于您的序号随着月份的有效日期值而变化,因此可以视为天
  • @ArunKillu:“Af”字段是每个注册中心在同一月份的顺序协议号...

标签: mysql triggers


【解决方案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 优先)使用索引是不可能的,因此您最终将始终获得完整扫描

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-09-17
    • 2023-04-11
    相关资源
    最近更新 更多