mysql:15874
From: "yoku ts." <"yoku ts." <yoku0825@xxxxxxxxxx>>
Date: Wed, 10 Oct 2012 17:33:39 +0900
Subject: [mysql 15874] Re: mysql5でのINSERT INTO hoge SELECT FROM tempでSELECT側のデータが取得できない。
Yukitakeさん こんばんは、yokuといいます。 結論から言うと、1と2を同時実行すると必ずロックが競合します。 2は勿論、1のクエリでも排他ロックを要求するからです。 3のクエリはロックを要求しない為、2の排他ロックとは競合せず待ちません。 時間がかかるのが…ということであれば、 SELECT INTO OUTFILEとLOAD DATA INFILEの併せ技で3,4を書き換えると幸せになるかも知れません。 これなら1ステートメントずつで済みますので。 ts. yoku 2012年10月10日 17:15 雪竹 勝義 <yukitake@xxxxxxxxxx>: > スタッフ、皆様 > お世話になります。 > > Yukitakeといいます。 > > mysql5での > INSERT INTO hoge SELECT FROM tempで > tempのデータをロックしている場合にtempのデータが取得できません。 > > 具体的には以下に記述します。 > > 1.以下のようなマスタファイルがあります。 > テーブル名 M_得意先 > 項目 コード、名 > データ > 1.田中商事 > 2,北村商事 > > この得意先マスタの内容をWORKテーブルへ以下のコマンドへそっくり移したいと思います。 > > ①INSERT INTO WORK( コード、名 )SELECT コード、名 FROM 得意先マスタ WHERE コード = 1 > > この時得意先マスタを編集するために以下のコマンドを発行していると上記コマンド①で得意先マスタを取得で > きずにタイムアウトします。 > > ②SELECT * FROM 得意先 WHERE コード = 1 FOR UPDATE > > > もちろんコマンド②を発行していない場合はコマンド①は成功します。 > また以下のようにコマンド①を分けて発行すると大丈夫です > > ③SELECT コード、名 FROM 得意先マスタ WHERE コード = 1 > ④INSERT INTO VALUES コマンド③の結果 > > ↑これだとコマンド②を実行していても大丈夫 > > 以上のようにmysqlでは他で行ロックしている内容はINSERT INTO SELECT FROMできないのでしょうか? > 検索をするとmysqlのINSERT INTO SELECT FROMはいろいろ制約があるようですが対応策があればと思います。 > > コマンド③④のように取得と書き込みを分けると可能なのですが件数が多いので実行時間がかかりすぎて(ルー > プで得意先マスタの件数分回す場合がある)使えません。 > 本当はコマンド①で一括で持ってきたいです。 > > > 何かアドバイスがあればよろしくお願いします。 > > 以上 > > > > >
15873 2012-10-10 17:15 [雪竹 勝義 <yukitake] mysql5でのINSERT INTO hoge SELECT FROM tempでSELECT側のデータが取得できない。 -> 15874 2012-10-10 17:33 ┗["yoku ts." <yoku0825] 15875 2012-10-10 17:55 ┣[tsyk goto <ngyuki.ts] 15877 2012-10-10 18:25 ┃┣["yoku ts." <yoku0825] 15879 2012-10-10 18:45 ┃┃┗[雪竹 勝義 <yukitake] 15880 2012-10-10 21:21 ┃┃ ┣["yoku ts." <yoku0825] 15882 2012-10-11 13:31 ┃┃ ┗[中川 貴 <takashi.nak] 15878 2012-10-10 18:39 ┃┗[雪竹 勝義 <yukitake] 15876 2012-10-10 18:09 ┗[雪竹 勝義 <yukitake]