3

行の自動 ID に基づいて (とりわけ) ハッシュの char 列を含む行を挿入しています。

それを挿入し、insert_id をフェッチし、ハッシュを計算し、更新できることはわかっています。

単一のクエリでこれを行う方法を知っている人はいますか? 挿入時に行 insert_id が必要になります。それは完全に不可能ですか、それとも current_insert_id() のようなものがあります...

ありがとう!

4

4 に答える 4

11

いいえ、MySQL にはcurrent_insert_id().

AUTO_INCREMENTMySQL のフィールドから生成された ID 値を取得する唯一の方法は、INSERT を実行してから を呼び出すことlast_insert_id()です。したがって、ハッシュを計算するために別の UPDATE を実行するという計画は、おそらくあなたがしなければならないことです。

他に 2 つの選択肢が考えられます。

  • 以外のメカニズムを使用して、INSERT の前に独自の値を自分で生成しますAUTO_INCREMENT。たとえば、UUID()関数を参照してください。

    SET @id = SELECT UUID();
    INSERT INTO MyTable (id, hash) VALUES (@id, hash(@id...));
    
  • ハッシュ計算に ID を含めないでください。

于 2009-05-16T22:43:10.837 に答える
2

MySQL で 1 つのクエリでそれを行う方法は私が知っていることではありませんが、選択したサーバー側スクリプト言語で次のようなことを行うことができます。

<?php

$query = mysql_query("SHOW TABLE STATUS LIKE 'MyTable'");
$row = mysql_fetch_assoc($query);
$next_id = $row['Auto_increment'];

?>

...これにより、SQL に組み込む ID が得られます。

編集:役立つかもしれないこの回答も見つけました。

于 2009-05-16T22:48:01.293 に答える
1

から次に使用する値を照会できますinformation_schemaTABLESテーブル、AUTO_INCREMENTそこの列。(競合状態を設定している可能性がありますか?)

于 2009-05-17T00:04:39.423 に答える
0

挿入を行うときは、次のようにします。

INSERT INTO table (col1,col2) VALUES (data1,data2);SELECT LAST_INSERT_ID()

データを取得しているようにクエリを実行するだけです。VB.NET の構文は次のとおりです (MySql.Data.MySqlClient .dll があると仮定します)。

Dim sql As String = "[sql string above]"
Dim dr As MySqlDataReader = YourRetrieveDataFunction(sql)

dr.Read()
yourObjectInstance.ID = dr(0)
dr.Close

技術的には2つのクエリですが、データベースへのヒットは1つだけです:)

于 2009-05-16T23:34:12.430 に答える