MySQL插入触发器同时具有多个插入

时间:2012-12-20 07:37:51

标签: mysql triggers insert

我正在尝试为我的表生成一个主键,就像这样 (简化版) - 目的是每日增加一个密钥:

DELIMITER ^

CREATE TABLE `ADDRESS` (
    ID INTEGER NOT NULL DEFAULT -1,
    NAME VARCHAR(25),
    PRIMARY KEY(`ID`))^

CREATE FUNCTION `GETID`()
RETURNS INTEGER
deterministic
BEGIN
    declare CURR_DATE DATE;
    declare maxid, _year, _month, _day, newid INTEGER;

    set CURR_DATE = CURRENT_DATE;
    set _year = EXTRACT(YEAR FROM CURR_DATE);
    set _mon = EXTRACT(MONTH FROM CURR_DATE);
    set _day = EXTRACT(DAY FROM CURR_DATE);
    set newid = (_year - (_year/100) * 100) * 10000 + _mon * 100 + _day;

    select max(ID) into maxid From `ADDRESS`;
    if (maxid is null) then
        set maxid = 0;
    end if;

    if (MAXID / 1000 != newid) then
        set MAXID = newid * 1000;
    end if;
    set MAXID = MAXID + 1;
    return MAXID;
END^

CREATE TRIGGER `ADDRESS_ID_TRIGGER` BEFORE INSERT ON `ADDRESS`
FOR EACH ROW
BEGIN
    if new.id=-1 then
        set new.id = getid();
    end if ;
END^

COMMIT^

DELIMITER ;

通常它工作正常,但是当我同时测试多个插入时 它显然失败了(例如没有脏读,第二次插入时选择最大值会失败, 因此它将生成与第一次插入时相同的id。)

1 个答案:

答案 0 :(得分:0)

解决方法:

  1. 制作主键AUTO_INCREMENT。
  2. 添加TIMESTAMP字段并使用BEFORE INSERT / UPDATE trigget设置CURRENT_TIMESTAMP()。
  3. 此外,您可以对TIMESTAMP字段使用ON UPDATE CURRENT_TIMESTAMP选项,值将自动更新。

    因此,ID是ID,TIMESTAMP字段包含日期和时间。