2016-06-13 11 views
-3

MYSQLに類似のカラムを持つ2つのテーブルがあります。 INSERT INTO table2 SELECT * FROM table1 WHERE column1=smthでデータをコピーしています。私はテーブルの中にautoincrementとKEYとして異なる列を持っています。私がmysqli_insert_idを使うときは、最後に挿入されたものよりも最初のものが得られます。最後のものを手に入れる方法はありますか?INSERT INTOテーブルSELECTに正しいlast_idが指定されていません

ありがとうございます。

+0

データベース構造、サンプルデータ、およびPHPコードについて何も共有していないと、これは答えることができません。最初は、AUTO_INCREMENTを一切取得しないようにしてください。なぜなら、空白を残していないように見えるからです。 –

+0

mysqli_insert_id()は、あなたにとって1つのid値しか与えません。マルチレコード挿入からIDを取得することはできません。 IDが必要な場合は、単一/個別の挿入とlast_insert_id()を1つずつ実行します。 –

答えて

2

リレーショナルデータベースにデータの継承順序はありません。あなたはそれがあなたのようなことで注文したいということであるフィールドを指定する必要があります。レコードがテーブルに書き込まれる順序に依存

INSERT INTO table2 
SELECT * 
FROM table1 
WHERE column1=smth 
ORDER BY <field to sort by here> 
LIMIT 1; 

は非常に悪い考えです。 idtable1にある場合は、ORDER BY id DESC LIMIT 1を使用して、降順でIDで結果セットをソートし、最後のものを選択してください。


は、MySQLによると、OPの質問について mysqli_insert_id

に対処するために更新された参照ここで呼び出された関数は、それが述べlast_insert_id()次のとおりです。

重要あなたは、単一のINSERT文を使用して複数の行を挿入した場合、 LAST_INSERT_ID()は、最初に挿入された 行のみに対して生成された値を返します。これは、他のサーバに対して簡単に同じINSERT文を再現できるようにするためです。

残念ながら、真の「最後に挿入されたID」を取得するには、2番目のクエリを実行する必要があります。あなたの最善の策は、SELECT COUNT(*) FROM table1 WHERE column1=smth;を実行し、そのcount(*)の返信を使用してmysqli_insert_idの値に加算することです。これは素晴らしいことではありませんが、この機能が大ヒットしているボリュームが高い場合は、これがおそらく最も安全なルートです。

安全性の低いルートは、SELECT max(id) FROM table2またはSELECT max(id) FROM table2 Where column1=smthです。しかし、再び、あなたのキーとこのインサートがヒットしている回数によっては、これは危険かもしれません。

+0

申し訳ありませんが、私は非常に明確ではなかったと思います。問題は、SELECTビットがいくつかのレコードを返し、それらのレコードがtable2に追加されると、mysqli_insert_idが最初に自動生成されたIDを返すことです。つまり、table1から3つのレコードを選択し、table2に挿入してID 4,5,6を作成すると、mysqli_insert_idは6ではなく4を返します。 – user3195616

+0

Gotcha!私はいつもここで最も低い共通分母に沈む。誰かがInnoDBのレコードの順序に頼っているところで十分な質問に答えました。私はあなたの質問に具体的に 'mysql_insert_id()'について答えるために最善を尽くしました。 – JNevill

関連する問題