6

シーケンスを使用して、データベース内の一部のオブジェクトにわかりやすい ID を作成したいと考えています。私の問題は、シーケンスをテーブルに対してグローバルにしたくないということです。代わりに、外部キーに基づいて値を増やしたいのです。

たとえば、私のテーブルは次のように定義されています。

CREATE TABLE foo (id numeric PRIMARY KEY, friendly_id SERIAL, bar_id numeric NOT NULL)

そして、次のようなステートメントfriendly_idごとに個別にインクリメントしたいと思います。bar_id

INSERT INTO foo (123, DEFAULT, 345)
INSERT INTO foo (124, DEFAULT, 345)
INSERT INTO foo (125, DEFAULT, 346)
INSERT INTO foo (126, DEFAULT, 345)

(望ましい動作):

id         | friendly_id      | bar_id
-----------+------------------+-----------------
123        | 1                | 345
124        | 2                | 345
125        | 1                | 346
126        | 3                | 345

(現在の動作)の代わりに:

id         | friendly_id      | bar_id
-----------+------------------+-----------------
123        | 1                | 345
124        | 2                | 345
125        | 3                | 346
126        | 4                | 345

これはシーケンスを使用して可能ですか、それともこれを達成するためのより良い方法はありますか?

4

1 に答える 1

6
create table foo (
    id serial primary key,
    friendly_id integer not null,
    bar_id integer not null,
    unique(friendly_id, bar_id)
);

アプリケーションで、重複キー例外が発生した場合に再試行するために、例外キャッチループで挿入をラップします

insert into foo (friendly_id, bar_id)
select
    coalesce(max(friendly_id), 0) + 1,
    346
from foo
where bar_id = 346
于 2013-02-22T00:10:44.940 に答える