2012-03-21 4 views
0

私は、互換性の問題で特定のプライマリキーを割り当てたため、自動インクリメントできないテーブルがMySQLにあります。プライマリキーが自動インクリメントしない場合に最後にIDを挿入する方法

新しいトッピングを(PHPで)挿入するたびに、挿入された最新のIDを取得する必要があります。それは愚かに聞こえるかもしれません。 PHPからIDを生成するのではなく、一般的なAJAX関数から来ているため、主キーを含む変数の名前はわかりません。常に変化します。

PHPまたはMYSQLを使用して、自動インクリメントしないプライマリキーに挿入された最新のIDを取得する方法はありますか?

残念ながら、mysql_insert_id()およびlast_insert_id()はauto_incrementなしでは機能しません。

ありがとうございます!

+3

あなたが挿入する前に、あなたの主キーが自動インクリメントが、あなたはすでにそれを知っている必要がありますしない場合。 – Rob

+0

'created_on'カラムを持ち、最新のものを取り出します。 – ceejayoz

+0

'MAX()'以外は? –

答えて

3

このページのコメントセクションに移動します。 http://php.net/manual/en/function.mysql-insert-id.php そして、あなたのために役立ついくつかの方法が表示されます。

私は、特定のtime_stampを挿入して、そのtime_stampの挿入を再度呼び出そうとします。

Daveはこのコメントで説明してくれます。ここでは、「AIを使用しない」に間違った情報がたくさんあり..です


彼を引用し、「最大 が同等である使用」。あなただけの、あなたは、あなたがAIフィールドがあるため 固有の競合状態を返していないについては本当に心配している場合は、人々が不適切 疑似乱数

を使用するために、あなたにアドバイス持つだけ VARSに基づいてselect文を実行します入力。 varsが一意でない場合は、 擬似乱数を使用しないでください。十分な反復がある場合、 確率は、これらのランダムの1つが複製になる確率は です。

代わりに、unixタイムスタンプを使用してください。ただし、照会に UNIX_TIMESTAMP()を使用しないでください。 select文を実行した直後に、別のタイムスタンプで が終了する可能性があります。

スクリプトの実行中にdate()がカウントアップを続けるため、 は単に日付(U)を変数または定義に格納します。次に、それに基づいて を挿入します。あなたはmysqlの手順を使用していないと仮定すると:

<?php 

define(UNIX_TIMESTAMP, date('U')); 

$db->query("insert into table values('', 'a', 'b', 'c', 'd', '".UNIX_TIMESTAMP."'"); 
$res = $db->query("select id from table where a_col = 'a' and b_col = 'b' and c_col = 'c' and d_col = 'd' and temp_id = 'UNIX_TIMESTAMP'"); 

//... 

?> 
2

次のSQL文は、最後に挿入されたPKのIDを取得します。

SELECT LAST_INSERT_ID() FROM tblName; 

真...あなたのINSERT文の後に、それを実行してください 、私はあなたのPKが自動インクリメントされないことを述べたことを忘れてしまいました。その後、タイムスタンプの解答を参照してください。あなたがこれを行うことができるということを私が知っている唯一の方法です。しかし、自動増分フィールドを持つことが望ましいです。たぶんあなたはデータベーススキームを見直す必要があります。

+2

'LAST_INSERT_ID()'はauto_incrementカラムでのみ機能します。 OPはauto_incrementの列ではないと言いました。 –

+0

私は彼が自動インクリメントを持っていないことを忘れています。 –

関連する問題