すべての行の最大値より一つ大きい値を挿入するSQL文を実行したいのですが、

以下のようにするとエラーになってしまいます。
update user set number = (select max(number) from user) + 1 where username = 'myusername';
エラーにならずに実現するにはどうすればよいでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/08/12 18:23:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:KUROX No.1

回答回数3542ベストアンサー獲得回数140

ポイント23pt

SQL分をSELECTとUPDATEの2つにわけては?

トランザクションがあるから、結果は同じになると思われ

るが・・・・。

ORACLEならシーケンスを使ったほうがよさそう。

http://q.hatena.ne.jp/answer

id:uniom

回答ありがとうございます。

SELECTとUPDATEの2つに分ければ確かにいけそうですね。

2007/08/12 18:18:57
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント23pt

エラーは 何のエラーが出ますでしょうか?

number という項目名が 予約語で使えないというようなことは ないでしょうか?

http://kashi.way-nifty.com/jalan/2006/11/post_b2a9.html

id:uniom

回答ありがとうございます。

エラーメッセージは以下のとおりです。

You can't specify target table 'user' for update in FROM clause

2007/08/12 14:42:51
id:kn1967 No.3

回答回数2915ベストアンサー獲得回数301

ポイント22pt

お使いのデータベースが何か判りませんが

多くの場合、同じテーブルをサブクエリ内では使えないという制限があります。

一例:MySQL(下記ページ最下段)

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.2.9 サブクエリのエラー


VIEWで対応可能になる場合もあるようなのですが

一時テーブルを用いる方法が無難かと思います。

CREATE TEMPORARY TABLE 一時テーブル名 SELECT -中略-;UPDATE -中略-;

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.5.3 CREATE TABLE 構文


気になってしかたないのですが・・・挿入って事はINSERTでは?

id:uniom

まさに、その制限でひっかかってました。

参考になりました。ありがとうございます。

2007/08/12 18:22:29
id:matsu-boolean No.4

回答回数43ベストアンサー獲得回数7

ポイント22pt

エラーメッセージをしらべて見るとどうも MySQL をお使いのようですね。

そういう時、MySQL では AUTO_INCREMENT を使えばよいようです。

http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.ht...

OracleやDB2なら、シーケンスオブジェクトを使います。

蛇足かもしれませんが、サブクエリーを使ってMAX値+1で挿入するやり方は以下の方法で出来ます。(Oracle, DB2)

case を使っているのはレコードが1件もない場合の対処です。また下記のSQLではキーワードで引っかかりそうなカラム名は "" で括っています。



  • テーブル構成はこんな感じで…

create table "USER" (

  "number" integer not null

  , username varchar(10) not null

  , primary key("number")

);



  • MAX値+1のキーで挿入

insert into "USER"("number", username)

values (

  (

    select

      case when max("number") is null then 1 else max("number") + 1 end

    from

      "USER"

  )

  , 'myusername'

);

id:uniom

AUTO_INCREMENTも検討したのですが、今回は文字も入っていたので断念しました。

OracleやDB2の例も示していただきありがとうございます。

2007/08/12 18:22:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません