• ベストアンサー

serialの値をINSERT時に取得する方法

PostgreSQL8.3系を使っています。 PostgreSQLのserial型を使って、連番を意識せずINSERTして登録しているのですが、直前に登録した連番(serial)が知りたいことがありまして、 簡単に取得する方法がわかりません。 気になる点ですが書きこんだ後、他から書き込みがあった場合の直前は他のデータになると思うので、書き込んだ直後のserialフィールドのmax値はあてにならないと考えますが、詳しい方教えてください。 書きこんだ直後についでに何か取得できる(書きこんだときのserial値がわかる)方法はあるのでしょうか?

  • ne5
  • お礼率4% (5/124)

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

  • ベストアンサー
回答No.1

8.2からRETURNINGというのがあるらしい。 http://blog.ozacc.com/archives/001613.html

その他の回答 (1)

  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.2

こんにちは。 CREATE TABLE pgtbl ( f1 SELIAL,  ・ ,  ・ , ); でテーブルが定義されていたら、f1のシーケンス名は pgtbl_f1_seqとしてpg_classに生成されています。 で、 SELECT last_value FROM pgtbl_f1_seq; ですべてのセッションで割り当てられた最後の値が取得できます。 (データ型(連番型), CREATE SEQUENCEを参照のこと)

関連するQ&A

  • Insert文直後に自動採番(auto_increment)した値を取得するには

    Insertして新しく採番されたフィールドの値を、その直後に確実に取得するにはどうしたら良いでしょうか。

    • ベストアンサー
    • MySQL
  • serial型について

    Postgresql7.2.4で user:postgresにより CREATE TABLE test (id serial PRIMARY KEY,num INT4) というテーブルを作成し、 GRANT ALL ON test TO PUBLIC と権限を与えました。 そしてPHP4よりuser:nobodyで INSERT INTO test (num) VALUES (1) というクエリを実行しようとすると ERROR: test_id_seq.nextval: you don't have permissions to set sequence wash_h_test_id_seq in test.php とでます。 しかし INSERT INTO test (id,num) VALUES (1,1) とするとちゃんとデータベースに反映されます。 PHPで、このユーザーからserialを使った自動連番で 書き込めるようにするにはどうすればいいのでしょうか。

  • INSERT文でフィールドの1つだけを他のテーブルから取ってきた値を入れたい

    挿入するフィールドの内1つだけを他のテーブルから取ってきた値を使いたいのですが、 insert into table1 (field1, field2, field3) values('a', (select field2 from table2 where field4='xxx'), 'b'); Oracleだと↑の書き方でいけるのですが、PostgreSQL(6.5.3)だとエラーになってしまいます。 2回もDBにアクセスしにいくのはいやなので、1文で書きたいです。上記以外で他の書き方をご存知でしたら教えてください。よろしくお願いします。

  • MySQLの連番扱い

    アクセス2000では、オートカウントという型が存在するので、 特に意識しなくてもレコードを作成するとカウントされますが MySQLやPostgreSQLでは連番というフィールドを設けた場合、 どのように連番をつけているのでしょうか? 例えば、連番のフィールド名をserialという名前にした場合、 連番のフィールドに値をセットする前に、select max(serial)+1 from table_sample; のように連番の値を求めるのでしょうか?

    • ベストアンサー
    • MySQL
  • まれにinsertエラーが発生する

    VB6からWindows版PostgreSQL8.2.4へ書き込みを行っています。 まれにinsertエラーが発生する為、困っています。(2日~7日に1回) エラー時のSQLログがあり、SQL文に間違いが無いことは確認ずみです。 エラー詳細を取っておらず詳細がわかりません。 (実際に現象を発生させようとしましたが、発生しません。) 追加するテーブル自体に主キーは設定していません。 データの書き込みは15秒に2レコード位なのですが、Update文の直後のinsert文がまれに失敗します。 とりあえず、トランザクション処理で回避していますが、PostgreSQLの設定値などの変更により、回避出来るのでしょうか。 また、この様な事はよくあることなのでしょうか。 説明が分かりづらく申し訳ありませんが、 宜しくお願いします。

  • INSERT時にデータ登録とmaxの発番がしたい

    <環境> SQLSERVER 2012 入力フォームに、入力した後で、DBに登録した際に、 依頼Noに、既にあるデータのMAX+100の値を登録したいです。 依頼NoにMAX+100の連番をふることは以下の方法でできたのですが、 INSERT INTO テーブル1(依頼No) SELECT MAX(依頼No)+100 AS NEW_ID FROM テーブル1 入力フォームのデータと登録と同時に、依頼Noを振りたいのですができません。 以下のように書いてみましたが、 根本的に間違っていると思うので、いい方法をご教授いただけたらと思います。 ※iraibi は入力フォームで、依頼日を入力した値です。 INSERT INTO テーブル1 (依頼No,依頼日) VALUES ('SELECT MAX(依頼書No)+100 AS NEW_ID FROM テーブル1','" & iraibi & "') 宜しくお願いいたします。

  • auto_incrementフィールドの書込み内容を知る方法

    auto_incrementの属性を持つフィールド(以後、id)を含むテーブルへ、書込みを行った場合、idフィールドには空番号が自動で付与されて書き込まれると思いますが、書き込まれた番号を効率的に知る方法はありますでしょうか。 例:id(auto_increment)、data1(char)のテーブルに対して、 data1に『AAA』をinsertした直後に、自動で付与されたid値を知りたい。 データをinsertした直後に最老番を調べる方法では、データのinsertが多数して行われた場合に、値がずれる恐れがあります。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • insertを高速化させたい

    問題:insertが遅い。20件程度の情報をテーブルにinsertするのに、30秒以上かかる。 環境:Windows XP, MYSQL(TABLE1のidにはindexつき) 仕様:textdata.csvを開き、idを取得する。取得したidをgetid変数に入れる。    取得したidがTABLE1に無いか調べる。idが無ければinsert。    あれば読み飛ばす。textdata.csvのidが無くなれば終わり。 con = CREATEOLEOBJ("ADODB.Connection") //ここでCSVファイルを開き、idを取得しループさせる getidSQL = "Select * from TABLE1 where id = '" + getid + "';" RS = con.Execute(getidSQL) If RS.EOF Then //DB登録--------------------------------------------------------------------------------------- str = "INSERT INTO TABLE1 (id) values('" + getid + "');" con.Execute(str) //DB登録終了------------------------------------------------------------------------------------ endif //CSVループ ちなみに、DBにinsertせずに、かわりにテキストファイルに書き込む方法だと一瞬で挿入が完了します。 これをDBに書き込む時に高速化を図りたいのですが、何か良い方法はないでしょうか?

  • PostgreSQL へのINSERTについて

    度々失礼します。 現在、入力フォームからの新規データをPostgreSQLに登録する仕組みを作成しています。 そこで、リストボックスから選んだ複数のデータをPostgreSQLに入力したいのですが、配列ではなく1つのデータなら $in_hair=$_POST["inp_hair"]; //table_hairに登録 $sql =""; $sql .="INSERT INTO table_hair"; $sql .=" VALUES('$in_store_cd',"; $sql .=" '$in_hair')"; $result=pg_exec($sql); if ($result == false) { printf("SQL:\"$sql\"の実行に失敗しました。"); exit; } で、出来ますが、配列となると、上のコードを配列された数だけ作成し、また、$in_hairをその数だけ1つ1つ入れていかなければならないと思います。 その際の、特にコードの書き方が良く分かりません。 また、何か他に良い方法も思いつきません。 お手数ですがどなたかご教授ください。 よろしくお願いします。 phpは4.2です。

    • ベストアンサー
    • PHP
  • 同じデータベース内で値の参照

    あるA,B,Cのテーブルがあり、 Aの主キーはシーケンシャル番号が振られています。 この値を参照し、B,Cのテーブルのフィールドに挿入したいのですが、 私のやり方は (1)まずAをInsertする (2)AでInsertしてできたシーケンシャル番号を取得し、 (3)BをInsertする (4)CをInsertする と少しややこしい方法しか思いつきませんでした。 何かよいアイデアがあれば教えていただけたら、ありがたいです。