4

MySQL データベースに 1 つの英数字と 2 つの数値を持つプライマリ ID としてデータを挿入しようとしています。このデータは自動的に増分的に数値を生成しますが、英数字の値は固定されます。同様に、D1、D2....D54、D55、D56 などです。ここで、「D」は常に同じですが、番号は自動的にインクリメントされます。これを行う方法はありますか?

4

2 に答える 2

5

まず第一に、そうするのはお勧めできません。他の人がコメントしたように、この id 値をその場で生成することができます。

それでも、自分のやり方でやりたい場合は、少なくとも 2 つの方法があります。

多かれ少なかれ信頼できる方法には、シーケンスとトリガーに別のテーブルを使用することが含まれます

スキーマ:

CREATE TABLE Table1_seq 
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE Table1
(
  `id` VARCHAR(10) NOT NULL PRIMARY KEY DEFAULT '',
   ...
);

引き金:

DELIMITER $$
CREATE TRIGGER tg_bi_table1
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq() VALUES();
  SET NEW.id = CONCAT('D', LPAD(LAST_INSERT_ID(), 4,'0'));
END$$
DELIMITER ;

次に、行を挿入するだけですtable1

INSERT INTO Table1 () VALUES (),(),();

そして、あなたは得るでしょう

| | ID |
----------
| | D0001 |
| | D0002 |
| | D0003 |

これがSQLFiddleのデモです

信頼できないINSERT方法は、ステートメント自体でその場で新しいIDを生成することです

INSERT INTO Table1 (id, ...) 
SELECT CONCAT('D', LPAD(COALESCE(SUBSTR(MAX(id), 2), 0) + 1, 4, '0')),
       ...
  FROM table1

これがSQLFiddleのデモです

このアプローチの問題点:

  1. 負荷が高い場合、2 つの同時セッションが同じMAX(id)値を取得し、同じ新しい ID を生成して挿入に失敗する可能性があります。
  2. 複数挿入ステートメントは使用できません
于 2013-08-23T15:15:58.853 に答える
0

英数字の自動インクリメントは設定できません。あなたの場合、 D が常に同じであれば、それを pk フィールドに追加する必要はありません。定数を別のフィールドに保持し、選択時に追加します。

于 2013-08-23T15:20:32.993 に答える