あるテーブルAのIDを取得して別のテーブルBに挿入しようとしています。Aに何も挿入していないため、last_insert_id()を使用できません。これをうまく行う方法について何かアイデアはありますか?
$n = mysql_query("SELECT max(id) FROM tablename");
が機能していないようで、機能していない
$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id");
MySQLでは、これはid
列から最大値を返します。
SELECT MAX(id) FROM tablename;
ただし、これはそのIDを$n
に入れません。
$n = mysql_query("SELECT max(id) FROM tablename");
値を取得するには、次のようにする必要があります。
$result = mysql_query("SELECT max(id) FROM tablename");
if (!$result) {
die('Could not query:' . mysql_error());
}
$id = mysql_result($result, 0, 'id');
Aから最後の挿入IDを取得し、それをBに挿入する場合は、次の1つのコマンドで実行できます。
INSERT INTO B (col) SELECT MAX(id) FROM A;
表をIDで降順に並べ、結果の数を1つに制限することができます。
SELECT id FROM tablename ORDER BY id DESC LIMIT 1
しかし:ORDER BY
は、このリクエストの全体テーブルを再配置します。したがって、大量のデータがあり、この操作を数回繰り返す必要がある場合は、このソリューションをお勧めしません。
私は別の解決策を持っています:
SELECT AUTO_INCREMENT - 1 as CurrentId FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME = 'tablename'
すべてのレコードにタイムスタンプを追加して、最新のものを入手すると思います。この状況では、任意のID、パック行、およびその他の操作を取得できます。
InnoDBは、次のアルゴリズムを使用して、ai_colという名前のAUTO_INCREMENT列を含むテーブルtの自動インクリメントカウンターを初期化します。サーバーの起動後、テーブルtへの最初の挿入に対して、InnoDBは次のステートメントと同等のものを実行します。
SELECT MAX(ai_col) FROM t FOR UPDATE;
InnoDBは、ステートメントによって取得された値を1つインクリメントし、それを列とテーブルの自動インクリメントカウンターに割り当てます。テーブルが空の場合、InnoDBは値1を使用します。
また、 SHOW TABLE STATUS とその "Auto_increment"値を使用することもできます。