• 締切済み

limit offset はupdate文には使用できないでしょうか?

MySQL5.1で、500万件あるテーブル a に対し、 100万件ずつ5種類のフラグを付けようと思います。 update a set flg = 1 limit 1000000; まではうまくいったのですが、 update a set flg = 2 limit 1000000,1000000; はSyntaxエラーとなりました。 select で一旦範囲指定し、キーを取得してから UPDATEをかける方法しかないでしょうか?

みんなの回答

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

ORDER BY と組み合わせて使えばよいのでは? そもそも順序の保証されないSQLでORDER BY なしにLIMITするのは まずいと思いますが・・・

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

関連するQ&A

  • updateのWHERE句にサブクエリーを書く事は不可?

    同じテーブルに対し、サブクエリーを使用して 更新することは可能でしょうか? test 1 である条件にマッチしたIDに対し、 フラグを書き換えたいのですが・・動作しませんでした。 update test1 set flg = 0 WHERE test_id = ALL (SELECT test_id FROM test1 WHERE flg = 1 AND a = 0) #1093 - You can't specify target table 'test1' for update in FROM clause

    • ベストアンサー
    • MySQL
  • UPDATE文(副問合せ?)について

    うまく説明できないのですが、下記のようなテーブルがあります。 テーブル名:A 項目: A1 A2 A3 A4 AテーブルのA1項目に「5」がセットされているデータについて、 A2に123、A3に321をセットしたいのです。 うまくいかない例ですが、下記のようなイメージです。 UPDATE A set A2=123,A3=321 FROM (SELECT * FROM A WHERE A1 = '5') ちなみに下の書き方はダメです。 「SELECT * FROM A WHERE A1 = 5」の部分は、必ず使用し、変更不可です。 × UPDATE A set A2=123,A3=321 WHERE A1 IN(SELECT A1 FROM A WHERE A1 = 5) 変な質問ですいませんが、何か方法があるのでしょうか。 よろしくお願いします。

  • UPDATE文の副問い合わせ

    こんばんわ。 今少し書き方がわからないSQL文があって困っています。 テーブルA(データが入ってるテーブル)に 新規でカラムを追加したので、 今UPDATE文を使いたいと思っています。 膨大なので、1つ1つする訳にはいかないので、 条件指定して、あるカラムにあるとある条件に合致するものは 新規カラムの値が4とか ある条件なら、新規カラムの値が6などと入れたい感じです。 自分なりに調べて UPDATE テーブル名 SET 新規カラム = 値 WHERE (SELECT * FROM 同じテーブル名 WHERE 条件) だと思って色々書いたり試行錯誤したのですが、 全然できませn。 どのように書けばよろしいのでしょうか? またUPDATEをかける際の条件指定に2つの違った 条件(同じカラムの違う条件、または別カラムの条件) を入れることは可能でしょうか? 回答いただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Excelでやるようにフラグ立てしたい

    最終的には以下のような「FLG1」、「FLG2」というカラムを追加したいです。 先頭はカラム名で、Excel上だと  FLG1には =IF(MOD(A2,2)=0,1,0)  FLG2には =IF(A2>=20,"L",IF(A2>=10,"M","S")) という数式が入っています。 V1 FLG1 FLG2 12 1 M 5 0 S 29 0 L 30 1 L 15 0 M MySQLのデータベース上には、元々「tbl1」というテーブルに「V1」のカラムだけがある。 その「tbl1」に対して、新たに「FLG1」と「FLG2」というカラム(フラグ列)を追加したい。 というのが目的です。 現状だと(まだMySQL初心者のため)「V1」をそのままコピーし、UPDATEを使って、1つずつ条件判定して値を上書きしていく方法しかわかっていません。。。 例えばFLG2については以下のように(汗) UPDATE tbl1 SET FLG2='L' WHERE V1>=20 UPDATE tbl1 SET FLG2='M' WHERE V1>=10 AND V1<20 UPDATE tbl1 SET FLG2='L' WHERE V1>=0 AND V1<10 たぶんいくつかの方法があると思うのですが、基本的なものから難しい(ちょっとテクを必要とする)ものまで幅広く教えていただけるとありがたいです。そうすれば、それを今後勉強していけるので。

    • ベストアンサー
    • MySQL
  • mysqlのupdateはどこでやるのですか?

    ものすごい愚問だったらすみません。 mysqlのデータをupdateするのはどこでするのですか? 今はhp上に xxx.phpをつくり、phpで今日の日付を取得し、複数のmysqlテーブルから条件抽出selectし、、、と値を出し、xxx.phpで $sql_l = "UPDATE table名 SET tyo{$month} = '{$ticket_city_month[price]}' WHERE cityname = '{$cityname}'"; $result = mysql_query($sql_l); とし、ブラウザ上から更新して、updateしています。 一応UPDATEはできているのですが、数が多く一気にできません。 (select時にデータ量を少なくするため、あえてwhereで一部ずづやってます。) phpMyAdmin 2.6.0 MySQL 4.1.20 で、 phpMyAdminとNavicat MySQLも利用しています。

  • UPDATE文のエラー直せますでしょうか?

    テーブル A と テーブル B は同じ構造です。 A のレコードを B のレコードで更新するにはどうすれば良いのでしょうか? UPDATE a Set( a.id = b.id, a.dat = b.dat ) FROM a INNER JOIN b ON a.id = b.id #1064 - You have an error in your SQL syntax; the right syntax to use near '( a.id = b.id, a.d = b.d ) FROM a INNER JOIN b ON a.id = b.id' at line 1 MySQL 5.1.33 CREATE TABLE `a` ( `id` INT NOT NULL , `dat` INT , PRIMARY KEY ( `id` ) );

    • ベストアンサー
    • MySQL
  • 特定の範囲のデータを削除するには

    現在MySQLについて色々試行錯誤して勉強しています。 タイトルに関して、例えばSELECT構文ならば SELECT * FROM `mytable` WHERE `hoge` = 1 ORDER BY `foo` DESC LIMIT 10 , 20 で、該当の10件目~30件目(20件分)の範囲を取得できますが、 DELETE構文だと、LIMIT に offset (LIMIT 10←これ , 20)の指定が出来ないようで、 自分で考えた方法だと、範囲の決め手となる最小値・最大値を出してから、 WHERE節でその範囲に当てはまるものを消す、 といった形で、MySQLに3回アクセスすることになってしまいます。 またこの方法だと、最小値又は最大値と同じ値があると、 それを消すことができません。 (きっちりやるには他のユニークキーを用意して使用するなど手間がかかりそうです) 例のSELECT構文のように簡略化できないでしょうか。 どうかよろしくお願いします。 ----------------- 環境  PHP 5.2.5  MySQL 5.1.22

    • ベストアンサー
    • MySQL
  • Updateの複数テーブル条件時のLIMIT実行

    すみません、MySQLのSQL文で教えてください。 以下のSQL文を実行すると UPDATE overflag c, asinprice d SET d.priceCheckUS = TRUE WHERE c.asin=d.asin AND c.priceOverUS=0 LIMIT 1; ERROR 1221 (HY000): Incorrect usage of UPDATE and LIMIT というエラーが出力されます。 UPDATE asinprice d SET d.priceCheckUS = TRUE WHERE d.asin='111' OR d.asin='000' LIMIT 1; は実行できました。 複数テーブルだと実行できないように理解しましたが、何が問題か教えてください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • JDBC(MySQL Connector J/)でのLIMIT句について

    JDBC(mysql-connector-java-3.1.8-bin.jarを使用)にて、MySQLからデータを取得するプログラム中で、どうしても解決できない問題がありご質問させて頂きました。 初心者で申し訳ございませんがご教授お願い致します。 上記のJDBCを使ってデータ数20万件程のテーブルから select * from test_table where id>100 order by id asc limit 0,500 のような感じでデータ取得を行うと、limitが500件までに設定しているにもかかわらず、whereでの条件に適合するデータが多いと(例えばwhere id>1)クエリの実行に非常に時間がかかり、結局OutOfMemoryで止まってしまいます。OutOfMemoryで止まるということは返ってくるデータが大きすぎるのかとも思いましたが、LIMITで制限しているし、何故か分からず困り果てております。 私が仕組みを理解していないだけなのかもしれませんが、宜しければご教授頂けませんでしょうか?宜しくお願いいたします。

    • ベストアンサー
    • Java
  • update文の副問い合わせ使用

    2つのテーブルを結合して、片方のテーブルをUpdateしたいが、Update文での結合方法がよくわかりません。 table_a の excode列が更新対象で、table_aのname列とtable_bのname列の等価結合です。 テーブルとデータの例は以下です。 テーブル1:table_a create table table_a (code int(3), name varchar(10), excode int(6)); insert into table_a values (101,'あいう',0),(102,'かきく',0),(103,'たちつ',0),(201,'なにぬ',0),(301,'わをん',0); テーブル2:table_b create table table_b (excode int(6), name varchar(10)); insert into table_b values (500101,'あいう'),(500102,'かきく'),(500103,'たちつ'); 期待する結果は以下です。 SQL> select * from table_a; +------+--------+--------+ | code | name | excode | +------+--------+--------+ | 101 | あいう | 500101 | | 102 | かきく | 500102 | | 103 | たちつ | 500103 | +------+--------+--------+ MySQLバージョンは、5.0です。 よろしくお願いいたします。