2017-10-02 3 views
2

異なるIDカテゴリに基づいて一意のIDを生成するにはどうすればよいですか?

| id   | name  | doc_no  | 
|:-----------|------------:|:------------:| 
| 1   | abc   |  D11710001 
| 2   | efg   |  D21710001 
| 3   | hij   |  D31710001 
| 4   | klm   |  D41710001 
| 5   | nop   |  D51710001 
| 1   | qrs   |  D11710002 

以下のように私は与えられたIDに基づいて一意のIDを生成するテーブルを持っています。たとえば、このテーブルにアイテムを格納すると、テーブルのIDに基づいて一意のIDが生成されます。

注:この表のidは外部キーです。 doc noは、ユーザーが手動で独自の形式に変更することができます。

IDフォーマット - D 'ID' '年' '月0001(自動インクリメント)

は、どのように私は、データを格納する時に固有のIDを生成するためのSQLを記述することができますか?

+1

通常は派生データを保存しません – Strawberry

+0

年月をどのように取得したいですか?現在の日付か別の日付か? –

+0

トリガーと 'BEFORE CREATE'を使ってIDを構築し、それを行に追加することができます。 – F0XS

答えて

1

@strawberryのコメントを続けると、でなく、というIDをデータベースに格納することをおすすめします。レコードを挿入すると同時に自動インクリメントIDにアクセスすることは難しいかもしれませんが、この生成されたIDを格納することは、既にテーブルに格納されている情報を複製することになります。 IDを保存する代わりに、クエリの際にIDを生成するだけです(例:

SELECT 
    id, name, doc_no, 
    CONCAT('D', id, STR_TO_DATE(date, '%Y-%m'), auto_id) AS unique_id 
FROM yourTable; 

これは、あなたがdateと呼ばれる日付列内の各レコードの挿入日付を格納されることを前提としています。また、テーブルにはauto_idという自動インクリメント列があるものとします。挿入された日付を保存することは、他の方法で役に立つ場合があることに注意してください。日付または時間に基づいてテーブル内のデータを検索する場合

0

あなたはトリガーを作成して、列を更新するか、あなたは自分のINSERT

insert into <YOUR_TABLE>(NAME,DOC_NO) values('hello','dummy'); 

update <YOUR_TABLE> set DOC_NO=CONCAT('D', 
          CAST(YEAR(NOW()) AS CHAR(4)), 
          CAST(MONTH(NOW()) AS CHAR(4)), 
          LAST_INSERT_ID()) 
WHERE id=LAST_INSERT_ID(); 

後に更新状態を書き込むことができます可能性があり、同時に、サーバが複数の要求を取得するときにSQL上記のように、競合状態を引き起こす可能性があり、注意してください。

@Tim Biegeleisenは良い点がありますが、あなたがデータを入力するときにIDを構築する方が良いです。

+0

私は自分のケースでトリガーを使用するのに適しているとは思わないが、ユーザーは自分の書式でドキュメントを変更するでしょう。ユーザーが項目コードフィールドを入力しなかった場合にのみ、文書番号は自動的に生成されます。 – Crazy

+0

@Zidanceあなたのアプリケーション設計までです。私はあなたにオプションを教えているだけです。 – Ravi

+0

あなたはあなたの解決策を得ましたか? – Ravi

関連する問題