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 ;

通常は正常に動作しますが、同時に複数の挿入でテストすると、明らかに失敗します(たとえば、ダーティリードがない場合、2番目の挿入でselect maxが失敗するため、1番目の挿入と同じIDが生成されます)。

4

1 に答える 1

0

回避策:

  1. 主キーをAUTO_INCREMENTにします。
  2. TIMESTAMPフィールドを追加し、BEFORE INSERT / UPDATEトリガーを使用してCURRENT_TIMESTAMP()を設定します。

またON UPDATE CURRENT_TIMESTAMP、TIMESTAMPフィールドのオプションを使用できます。値は自動的に更新されます。

したがって、IDはIDであり、TIMESTAMPフィールドには日付と時刻が含まれます。

于 2012-12-20T08:14:16.563 に答える