6

> Project という名前のテーブルがあり、プロジェクトの見積もり入札番号の自動インクリメント フィールドがありますProject_ID

このフィールドは自動インクリメントされます。フィールド規則を保持する 8 桁の文字フィールドとして作成しました。

2 桁の年、2 桁の月として自動インクリメントする必要があり、ハイフンが含まれ、その期間の最初のレコードの001から始まる数値が必要です。

2012 年 4 月の例では、最初のレコードは 1204-001、2 番目は 1204-002 などです。5 月になると Project_ID は 1205-001 に変わります。

私が書こうとしてきたのは次のとおりです。デフォルト値の単純なデフォルト式として保持しました

Cyear(date()) + (month()) + “-“ + “001” . 

どうすればこれを達成できますか?

4

3 に答える 3

1

基本的に、列をインクリメントするテーブルでBEFOREINSERTを使用できます。 TRIGGER

簡単なアルゴリズムを作成し、このコードをトリガー内に配置するためのいくつかの手順を次に示します。

// get current YEAR
SET @cur_Year = CONCAT(DATE_FORMAT(CURDATE(), '%Y'));
// get current MONTH
SET @cur_MONTH = CONCAT(DATE_FORMAT(CURDATE(), '%m'));
// concatenate YEAR and MONTH
SET @Year_Month = CONCAT(@cur_Year, @cur_MONTH);
// get the last value for the current YEAR and MONTH
SET @max_ID = ( SELECT MAX(ID) 
                FROM    tableName 
                WHERE   ID LIKE CONCAT(@Year_Month, '-%'));
// get the last three characters from the id, convert in to
// integer and increment by 1
SET @last_ID = CAST(RIGHT(@max_ID, 3) AS SIGNED) + 1;
// pad zero on the left using LPAD and 
// concatenate it with YEAR and MONTH
SET @new_ID =   CONCAT(@Year_Month,'-',LPAD(CAST(@last_ID AS CHAR(3)), 3, '0'));
于 2013-02-12T09:17:49.550 に答える
0
INSERT INTO (Project_ID, col1, col2, col3)
SELECT DATE_FORMAT(NOW(), CONCAT('%y%m-', 
    ((  SELECT RIGHT(CONCAT('000', (RIGHT(Project_ID, 3) + 1)), 3) AS number
        FROM table_name
        WHERE LEFT(Project_ID, 5) = DATE_FORMAT(NOW(), '%y%m-'))
        ORDER BY Project_ID DESC
        UNION
    (   SELECT '001')
        LIMIT 1))),
'Col1 data', 'Col2 data', 'Col3 data'

これは少し奇妙に見えるかもしれないので、流れを簡単に説明します。

INSERT INTO ... SELECTから既存のデータをチェックしtable_nameて、既存のケースが既にあるかどうかを確認できるように使用します。は既存のケースを見つけます。両方のWHEREおかげで、必要な関連データを切り出すのはそれほど難しくありません。行が見つからない場合は、代わりに が使用され、示されているように既存の列を割り当てるだけです。RIGHTLEFT'001'

于 2013-02-12T09:25:45.860 に答える