3

私は InooDB テーブルを持っています:

  • id - 主キー、自動インクリメント
  • short_code - varchar(6)、一意
  • 他のいくつかの列

short_code常に に基づいて php で生成されidます。問題はshort_code、 . がわからないため、レコードを挿入する前に を生成できないことidです。

私は次のことを試しました:

  1. 空の short_code を持つレコードを挿入します
  2. 挿入された行の ID をmysqli_insert_id、または pdo などで取得します
  3. ID に基づいてショート コードを生成し、新しい short_code でレコードを更新します

これは機能しますが、これは本当に遅いです。挿入と更新を行う必要があり、時間がかかります。

より良いアイデアは、挿入したいレコードが持つIDを「推測」し、 select max(id)+1 from mytable;(または同様のもので)short_codeを生成し、レコードを挿入することです。ここでは、実際にははるかに優れた SELECT と 1 つの INSERT があります。

私の質問は:

  1. この問題に対するよりスマートな解決策はありますか?
  2. いいえ、解決策 2 (次の id を推測) を使用するselect max(id)+1 from mytable;場合、max(id)=1.その間?

ノート!

  • mysql プロシージャで短いコードを生成できません。
  • ID に基づいてショート コードを生成する必要があります。
4

3 に答える 3

3

挿入中にコードを生成できる DB トリガーを使用します。

例 ( を生成するルールがわからない場合short_code):

delimiter $$
create trigger code_gen after insert on your_table
for each row
begin
   SET NEW.short_code = NEW.id + 1;
end
$$
delimiter ;
于 2012-12-25T10:08:22.447 に答える
2

Auto-inc値は、挿入が発生したときに生成されます。これは、構成に依存するロック手法(2つの同じ値での生成を回避するため)を使用しており、推測することはできません。トランザクション環境では、多くのトランザクションで新しいIDが必要になる場合がありますが、コミットされる場合とされない場合があるため、クエリの時点で値は予約されていますが、まだ使用されていません。

正しい値を「推測」する場合は、テーブル全体を書き込み用にロックして、別のスレッドがレコードを挿入しないようにし、推測を破る必要があります。これは、テーブルに多くの書き込みがない場合、たとえば1秒あたり数ダースの挿入の場合に機能します。

このテーブルに多くの更新があり、書き込みロックがオプションでない場合は、別のテーブルを使用して値を生成でき(idフィールドのみが含まれます)、挿入/更新の代わりに挿入/挿入があります。 2つの操作が可能な限り高速になると仮定します。

于 2012-12-25T10:26:21.323 に答える
1

以下のURLをチェックしてください(thinkswanの回答)
テーブルの行数を取得する最も効率的な方法
この方法で、自動インクリメント値を取得できます。あなたの場合、IDは自動インクリメントであるため、IDを取得できます。このようにして、最初の問題は解決されます。
あとは、id を使用して short_code を生成し、レコードを挿入するだけです。

于 2012-12-25T10:17:36.280 に答える