• ベストアンサー

SELECT実行中にINSERTしたい

テーブルTに対し、データ抽出に数分かかるようなSELECT文を実行しているとして、 そのSELECT文の実行中にInsertしたらどのような挙動になるでしょうか。 (INSERTした瞬間にエラーが発生する?) また、SELECT文の実行中にInsertしたら、 「SELECT文が実行終了するまで待って、そのあとにINSERTする」 という動きにしたい場合、どのように設定(or SQLを書けば?)すればよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>私が使ってるのはmyisam myisamの場合、データの堅牢性を犠牲にして高スピードを実現しているので 難しいかもしれませんね SELECTとINSERTのタイミングがコンマ数秒レベルで絶妙にネックになるよう 仕組みを考えているならmyisamは控えた方がよいでしょう。 そうでないならほぼ問題にはならないと思います

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ロックとかトランザクションの世界ですね このへんが参考になるかも

参考URL:
http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locks-set.html
stolichnaya
質問者

お礼

ありがとうございます! とりあえず読んでみます。 これってinnodbの資料みたいですね。私が使ってるのはmyisamなので、ちょっと探してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • select insertで複数テーブルから値を取得したい

    環境:oracle9i select insertで、2つのテーブルから値を取得して、1つのテーブルにinsertすることは可能でしょうか? たとえば、以下の場合、どのようなSQL文を書けばよいか、アドバイスいただけますでしょうか。 よろしくお願いします。 insertしたいテーブル:A Aテーブルの項目:o,p,q,r,s,t 値を取得するテーブル:B,C Bテーブルの項目:o,p,q,r Cテーブルの項目:o,p,s,t oとpが主キーになっていて、それらが一致するBとCのデータを あわせて、Aにinsertしたいと思っています。 insert into A(o,p,q,r,s,t) select このあと、どのように書けばよいのかがわかりません。

  • INSERT文のSELECT部分の更新

    insert into selectについて教えてください。 あるテーブルからselectした値と、連続する値を 同時にinsertするする事はできますでしょうか? 使用DBはOracle9iです。 例えば、以下のようなテーブルがあった時に テーブルA カラム1 カラム2 カラム3 カラム4 この時に、カラム1,カラム2,カラム3を別のテーブルからselectし、 カラム4には「100001」から順に値を1ずつ増やしてながら セットしたい場合、1つのSQLで実行する事は可能でしょうか? ヒントなどいただけたらと思います。よろしくお願いします。

  • INSERTできません

    以下のSQL文でテーブルに追加したいのですが、実行すると 実行中のメッセージがでたまま動かなくなってしまいます。 他のテーブルで同じようなINSERT文を実行すると追加できるので SQL文の間違いではないと思うのですが、原因がわかりません。 どなたか教えてください。 INSERT INTO table (CODE_A, CODE_B, SAISYUU_KOUSIN_DATE) values('9999', '999999', TO_DATE('2005/11/0716:15:14','YYYY/MM/DD HH24:MI:SS'));

  • プログラム内のINSERT文が実行されない。

    CGIのソース内でINSERT INTO テーブル名 SELECT文を使って行追加しているのですが、処理がエラーの場合の処理が動いてしまい実行されません。 ただ、同じSQL文をphpMyAdminのデータベースサーバーのSQLにコピペして実行すると問題なく行追加されました。 なので、問題があるとしたらそのプログラムだと思うのですが、原因がつかめません。 SQL文を変数に格納してから実行させてその結果によってエラーメッセージを出す処理は以下の通りです。 $sql = (INSERT INTO テーブル名 SELECT ****** FROM ***** WHERE ******) $ins_result = $db->prepare($sql); $num = $ins_result->execute; if ( not $num ) { &db_rollback; &db_disconnect; &msgout("エラー1","エラーメッセージ","システムエラー"); } すでに作られているプログラムを修正しています。ちなみに、そのプログラムを作った人はすでに現場にはいませんので聞けません。 msgout内に$ins_resultと$numを表示してみましたら、前者は「DBI::st=HASH(0x9f38560)」で、後者は何も入っていないつまり空でした。 【if ( not $num )】のif文も意味が分からないです。私の知識から解読すると $numの否定が真だったらカッコ内の処理を実行するという意味だと思いますが、$numは空なので空でないことが真だったらとなりますが、どういう意味なんでしょうか? プログラム内のSQL文がなぜ実行できなかったのかその原因を調べることができるツールとかあれば試すことができるのですが、データベースで実行して成功したところを考えるとあまり意味ないかもしれませんが。 過去カラム数が違ってたとか、追加データの長さが範囲外だったとかが原因だったことがありましたが今回はそのどちらでもなさそうです。

    • ベストアンサー
    • CGI
  • SQLのインサートでヌルを挿入できないというエラー

    SQLサーバーで、INSERT INTO・・・selectで抽出した列の値を入れたいのですが、主キーのところで下記のエラーが出ます。 テーブル ・・・の列 '・・・' に値 NULL を挿入できません。この列では NULL 値が許可されていません。INSERT は失敗します。 ステートメントは終了されました。 selectで抽出するテーブルの該当列を確認しても値はあるはずですが・・。 原因は何が考えられますか? お願いします・・・。

  • OracleのInsert/Selectにて

    Oracle Database 11g で、対象のテーブルにInsert/Select文を実行すると、Selectの件数とInsertされた件数が違います。 制約に引っかかっている訳ではないのにこの現象が発生しており、困惑しております。 原因や解決方法がお分かりの方が居ましたら、ご教授ください。 また同じような現象が発生した方や回避方法があれば情報頂きたいです。 宜しくお願い致します。

  • Insert Into Select での重複について

    DB:SQLServer2000 こんにちは お世話になっております。 トランザクションのテーブルA から ワークのテーブルBへInsert Into Select を使用してデータを格納しているのですが、その際に重複が発生してしまいます。 テーブルA 主キーあり テーブルB 主キーなし Delete B Insert into B select 項目1,項目2,・・・ from A With(Nolock) where 日付項目 = 20080101 テーブルAの主キー項目は全てテーブルBへInsertしており、Insert完了後のテーブルBの中身を見ると、まれに全く同じデータが2件出来ていることがあります。 このInsert into selectが実行されている間に、テーブルAに対して登録更新が行われることもあります。 色々と試してはいるのですが、原因が特定できずに困っております。 もし何かお気づきになられる方がいらっしゃいましたら、ご教示下さい。 よろしくお願い致します。

  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • SQLServerでSELECTを実行すると仮想メモリがなくなる

    Microsoft SQLServer Ver.7をWin2000上で使用しています。 SQLServer上のデータベースにASPでアクセスしていたところ、今までは正常に動いていたのに、突然「システムの仮想メモリがなくなって来ています」というWindowsメッセージが表示され、システム全体が非常に重くなってしまいました。この重さは、再起動しない限り直りません。 調べてみたところ、ある特定のテーブル(table1とします)に対してSELECT文を実行すると、こうなるようです(SELECT文の結果も返ってきません)。 同じテーブルに対してのINSERTは、特にシステムが重くなることもなく正常に実行できました。 同じデータベース上にある他のテーブルに対しては、普通にアクセスできています。 この現象が発生するようになる前に行ったことといえば、table1と同じデータベース上にある別のテーブルtable2を、一旦削除して作成し直したことくらいです。 仮想メモリのサイズを増やしてみたりもしたのですが、何も変わりません。 テーブルアクセス時にだけこうなるので、テーブルの設定にどこかまずいところがあるような気がするのですが……。 メモリがなくなってしまう理由に、何か心当たりはないでしょうか? (SQLServerを使い始めて日が浅いので、用語や表現におかしなところがあるかもしれません。できましたら、それも指摘していただけるとうれしいです)

父の爪の変色について
このQ&Aのポイント
  • 父の爪に薄い茶色の線があるように見えます。水虫や爪の変色、巻き爪など爪のトラブルがあるため心配ですが、加齢によるものかどうかは不明です。
  • 父の爪の変色が水虫によるものかどうか不安です。ただの変色に見える場合もありますが、病気などもあるため注意が必要です。
  • 父の爪に見える茶色い線は水虫によるものかもしれませんが、確定的な診断は医師に相談する必要があります。加齢による変色の可能性もあるので、症状の進行に注意が必要です。
回答を見る