8

私はそのようなことをしようとしています:

INSERT INTO dir_pictures SET filename=CONCAT(picture_id,'-test');

picture_id は私の主キー、自動インクリメントです。基本的に、このinsertステートメントのIDをステートメント自体に入れようとしています。

PHPコードを追加するか、複数のステートメントを使用して実行できると確信していますが、一度に実行するための迅速かつ簡単な方法があるかどうか疑問に思っていました.

PS。上記のステートメントは常に「0-test」を入れます

4

5 に答える 5

10

最初にレコードを挿入します。次に、ステートメントをセミコロンで区切り、 LAST_INSERT_ID()を使用して、新しく挿入された自動インクリメント ID を取得します。一発で実行。

dir_pictures に挿入します .... ;
update dir_pictures set filename=CONCAT(LAST_INSERT_ID(),'-test') where id = LAST_INSERT_ID()
于 2009-10-28T23:30:00.237 に答える
3

挿入の一部として、information_schemaからテーブルの現在のauto_increment値を選択するだけです。

INSERT INTO dir_pictures SET filename=CONCAT((SELECT auto_increment FROM
information_schema.tables WHERE table_name='dir_pictures'), '-test')
于 2009-10-28T23:40:04.677 に答える
0

本当に1つのSQLステートメントでそれを実行したい場合は、次のようなハックを試すことができます。

INSERT INTO dir_pictures SET filename=CONCAT((select max(picture_id)+1 from dir_pictures),'-test');

これがマルチスレッドアプリの場合は、競合状態に注意してください...

また、空のテーブルで機能するとは思えません...

于 2009-10-28T23:35:39.693 に答える
0

まあ、挿入が完了するまで行IDを知ることはできません...だから、それがうまくいくとは思いません!

代わりに、行を取得するときにファイル名を計算しないのはなぜですか?

INSERT INTO dir_pictures (file_extension) VALUES ('-data')

SELECT picture_id, CONCAT(picture_id, file_extension) as filename
FROM dir_pictures
于 2009-10-28T23:32:43.943 に答える
0

これは実際には不可能です。おそらく、入力ではなく出力で単純に連結することをお勧めします。

CONCAT(id, '-text') をファイル名 FROM dir_pictures として選択

于 2009-10-28T23:33:08.327 に答える