1

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

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)。

4

1 回答 1

0

解决方法:

  1. 使主键 AUTO_INCREMENT。
  2. 添加 TIMESTAMP 字段并使用 BEFORE INSERT/UPDATE 触发器设置 CURRENT_TIMESTAMP()。

您也可以使用ON UPDATE CURRENT_TIMESTAMPTIMESTAMP 字段的选项,值将自动更新。

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

于 2012-12-20T08:14:16.563 回答