2016-04-26 8 views
0

自動インクリメント整数フィールドをすぐにに追加することが可能かどうか、私はCREATE TABLEステートメントで定義していないのでしょうか?PostgreSQLの自動インクリメントカラムはオンザフライですか?

例えば、私は文を持っている:

SELECT 1 AS id, t.type FROM t; 

と私は

SELECT some_nextval_magic AS id, t.type FROM t; 

にこれを変更することができています私はsome_nextval_magic部分にその場で自動インクリメントフィールドを作成する必要がありますなぜなら、結果の関係は、より大きなSQLステートメントの構築中にというの一時的なものであるからです。 idフィールドの値は、それが一意である限り重要ではありません。

多くの場合、SERIALを指定するか、またはをCREATE TABLEに含む関連する質問(PostgreSQL Autoincrement)の回答を検索します。しかし、必ずしもCREATE TABLEまたはVIEWを使用する必要はありません(私がしなければ)。 generate_series()についての議論もいくつかありますが、ここに当てはまるかどうかはわかりません。

- 更新 -

私のモチベーションは、PostGISの拡張子についてこのGIS.SE answerに例示されています。元のクエリは:g.path[1] as gidは「QGISでの可視化のために必要な」idフィールドで

CREATE VIEW buffer40units AS 
SELECT 
    g.path[1] as gid, 
    g.geom::geometry(Polygon, 31492) as geom 
FROM 
    (SELECT 
    (ST_Dump(ST_UNION(ST_Buffer(geom, 40)))).* 
    FROM point 
) as g; 

。唯一の必要条件は、整数ユニークなです。 g.path[]配列が空の場合、上記のクエリを実行するといくつかのエラーが発生しました。

上記のクエリで列を修正しようとしますが、この考えは私に来た:gid値はとにかく問題ではありませんので

、代わりにここで使用することができ、自動インクリメント機能はありますか?

+2

PostgreSQLにはCREATE SEQUENCEがあります。これらの数字から数字を増やすことができます。 – Thilo

+0

@tinlyx必要な一意性の詳細を教えてください。クエリ内ではローカルクエリとグローバルクエリで比較します – donkopotamus

+0

コードを投稿してください。適切な質問をする方法を知っていれば十分に長い間あなたは周りにいました。ステートメントの作成方法に応じてさまざまな解決策があります。詳細な情報がなければ、野生の趣味は何も得られません。 – Patrick

答えて

2

あなたがrow_number()窓関数を使用、出力の各行に一意の整数を割り当てidフィールドを持っているしたい場合:

select 
    row_number() over() as id, 
    t.type from t; 

を生成idのみの各実行内で一意になりますクエリ。複数回実行すると、idの新しい一意の値は生成されません。

+0

@tinlyx:番号はどのくらいユニークでなければなりませんか?クエリ自体の中だけで?クエリの複数の実行にわたって – Thilo

+0

@Thilo、理想的には、できる限り同時実行で一意です。 – tinlyx

+0

注文は重要ですか?そうでなければ、ハッシュ関数を使うだけです –

関連する問題