3

私のクエリは次のようになります。

INSERT INTO table1 (lfd, somedata)
select (select max(lfd) + 1 from table1), somedata from table2

Table2には複数の行があります。したがって、table1に複数の行を挿入する必要があります。これは機能しますが、挿入されたすべての行に対してlfdが同じ数に設定されます。

したがって、挿入された最初の行でmax(ldf)+ 1が「2」の場合、後続のすべての行でも「2」になります。もちろん、次の行のmax(lfd)+ 1は「3」を返すはずなので、これは正しくありません。

挿入ごとにサブクエリを再評価するようにmysqlに指示するにはどうすればよいですか?

あるphp-galleryから別のphp-galleryにデータを移行するため、テーブル構造に触れることができません。テーブルの構造は、アプリケーションの制御下にあります。

Oracleでは、シーケンスを定義し、副選択でsqueencename.nextvalを選択するだけです。-私はそれがうまくいくとかなり確信していますが、mysqlは私が知る限りシーケンスを提供していませんよね?

4

2 に答える 2

0

自動インクリメント列として定義lfdするだけです。そうすれば、わざわざする必要はありません。select max(...) ...

これを行う別の方法は次のとおりです。

insert into table1 (lfd, somedata)
select 
  (
    select count(*) + (select count(*) from table1) 
    from table2 l
    where l.lfd <= r.lfd
  ),
  r.somedata
from table2 r;

これがどのように機能するか:

  1. table2行を1からnにランク付けします(ここで、nはの行数ですtable2
  2. max(lfd)ランクにイニシャルを追加して、値が一意になるようにします

警告:これはn ** 2クエリであるため、ビッグデータセットがある場合は時間がかかる可能性があります。

于 2012-04-30T19:16:40.360 に答える
0

これを一度試してください:

SELECT MAX(lfd) + 1 INTO @i FROM table1;

INSERT INTO table1 (lfd,col1,...)
SELECT @i:=@i+1,somedata,... FROM SomeTable;

基本的に、これは変数をシーケンスとして使用し、テーブルの現在の最大IDで初期化します。

table1このクエリの実行中に行が挿入されると、ここで同時実行の問題が発生する可能性があることに注意してください。

于 2012-04-30T19:55:46.133 に答える