web-dev-qa-db-ja.com

INSERTなしで最後のIDを選択します

あるテーブル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");
8
Illes Peter

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;
29
Mike

表をIDで降順に並べ、結果の数を1つに制限することができます。

SELECT id FROM tablename ORDER BY id DESC LIMIT 1

しかし:ORDER BYは、このリクエストの全体テーブルを再配置します。したがって、大量のデータがあり、この操作を数回繰り返す必要がある場合は、このソリューションをお勧めしません。

5
QuicksandDiver

私は別の解決策を持っています:

SELECT AUTO_INCREMENT - 1 as CurrentId FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME = 'tablename'
0
Chris Turangan

すべてのレコードにタイムスタンプを追加して、最新のものを入手すると思います。この状況では、任意のID、パック行、およびその他の操作を取得できます。

0
GOsha

最大列値を取得してインクリメントする

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"値を使用することもできます。

0
silent