MySQL データベースに 1 つの英数字と 2 つの数値を持つプライマリ ID としてデータを挿入しようとしています。このデータは自動的に増分的に数値を生成しますが、英数字の値は固定されます。同様に、D1、D2....D54、D55、D56 などです。ここで、「D」は常に同じですが、番号は自動的にインクリメントされます。これを行う方法はありますか?
質問する
2738 次
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のデモです
このアプローチの問題点:
- 負荷が高い場合、2 つの同時セッションが同じ
MAX(id)
値を取得し、同じ新しい ID を生成して挿入に失敗する可能性があります。 - 複数挿入ステートメントは使用できません
于 2013-08-23T15:15:58.853 に答える
0
英数字の自動インクリメントは設定できません。あなたの場合、 D が常に同じであれば、それを pk フィールドに追加する必要はありません。定数を別のフィールドに保持し、選択時に追加します。
于 2013-08-23T15:20:32.993 に答える