0

この例に基づいて自動インクリメント フィールドを作成する方法:

このテーブルには、「AF」フィールドがあり、次の形式になっています: SN.MM.YYYY 「SN」= 最後の挿入に基づく AI 番号、MM= Atual Month、YYYY = Atual Year。

| 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: 1 日に複数のレコードが存在する可能性があるため、日は重要ではありません。

下手な英語でごめんなさい

みんなありがとう!

4

1 に答える 1

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 値を作成する) には、2 つの大きな欠点があります。

  1. 同時アクセスが多い場合、異なる接続が同じ AF 番号を取得する場合があります
  2. 特定の AF パターン (SN が最初に来る) のため、インデックスを使用することは不可能であるため、常にフル スキャンを取得することになります。
于 2013-10-23T14:50:53.723 に答える