48

私の目的は、テーブルに新しい行を挿入するときに主キーフィールドが自動的に挿入されるようにすることです。

PostgreSQLでセッション間を移動するシーケンスを取得するにはどうすればよいですか?

 doubleemploi@hanbei:/home/yves$ psql -d test
 Mot de passe : 
 psql (8.4.13)
 Saisissez « help » pour l''aide.

 test=> create sequence test001 start 10;
 CREATE SEQUENCE
 test=> select currval('test001');
 ERREUR:  la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session
 --- current value not yet defined this session (???)
 test=> select setval('test001', 10);
 setval 
 --------
      10
 (1 ligne)

 test=> select currval('test00');
  currval 
 ---------
       10
 (1 ligne)

 test=> \q
 test@hanbei:/home/yves$ psql -d test
 Mot de passe : 
 psql (8.4.13)
 Saisissez « help » pour l''aide.

 test=> select currval('test001');
 ERREUR:  la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session
4

5 に答える 5

135

currvalは、現在のセッション内でシーケンスに対して生成された最後の値を返します。したがって、別のセッションがシーケンスの新しい値を生成した場合でも、エラーを回避して、あなたのセッションによって生成された最後の値を取得できます。

ただし、任意のセッションで最後に生成された値を取得するには、上記を使用できます。

SELECT last_value FROM your_sequence_name;

値がコミットされていない (または中止された) トランザクションを持つ他のセッションによって使用され、この値を参照として使用すると、エラーが発生する可能性があることに注意してください。この値を取得した後でも、既に古くなっている可能性があります。一般に、人々currvalは のリターンまたは のリターンさえも必要としsetvalます。

于 2012-09-18T18:18:32.657 に答える
20

これはあなたが思っているよりも簡単かもしれません...

私の目的は、テーブルに新しい行を挿入するときに自動的に挿入される主キー フィールドを取得することです。

列のデフォルト値を設定するだけです:

ALTER TABLE tbl ALTER COLUMN tbl_id SET DEFAULT nextval('my_seq'::regclass);

または、さらに簡単に、serial最初に主キーのタイプを使用してテーブルを作成します。

CREATE TABLE tbl(
  tbl_id serial PRIMARY KEY
 ,col1 txt
  -- more columns
);

専用のシーケンスを作成し、デフォルトをtbl_id自動的に設定します。

Postgres 10 以降では、IDENTITY代わりに列を検討してください。見る:

tbl_idで言及しない場合、この方法には、添付されたシーケンスから次の値が自動的に割り当てられますINSERT。同時実行かどうかに関係なく、任意のセッションで動作します

INSERT INTO tbl(col1) VALUES ('foo');

新しいtbl_idバックで何かをしたい場合:

INSERT INTO tbl(col1) VALUES ('foo') RETURNING tbl_id;
于 2012-09-18T22:35:13.560 に答える