0

[別のテーブルのページごとのコメント] の [主キー カウンター] を含むテーブルがあります。
これらの主キーはページごとです。各ページのコメント ID は 1 から始まります。

10 個の新しいコメントを書き込むために、10 個の ID をアトミックに割り当てたいと思います。
— PostgreSQL と JDBC でこれを行うことはできますか?

(そして、例/関連する JDBC ドキュメントへのリンクはありますか?)

returning新しく挿入された行の主キーがどのように使用されるかについての例のみを見つけましたがgetGeneratedKeys、私の場合は役に立たないようです。

                                                      ***

SQL UPDATE ステートメントは次のようになると思います。

update PAGES
set NEXT_COMMENT_ID = NEXT_COMMENT_ID + 10
where PAGE_ID = ?                    <-- next-comment-id is *per page*
returning NEXT_COMMENT_ID into ?

したがって、異なるスレッドやサーバーが同じ ID を再利用/上書きしようとすることはありません (そうですか?)。

4

5 に答える 5

4

これは、オブジェクトでexecute()andgetResult()メソッドを使用しなくてもサポートされます。Statement

このようなもの(エラー処理をむき出しに):

String sql = "update ... returning ...";
boolean hasResult = statement.execute(sql);
int affectedRows = 0;
ResultSet rs = null;
if (hasResult) {
  rs = statement.getResultSet();
}
int affectedRows = statement.getUpdateCount();

ステートメントが何をするかを知っているので、これで問題ないはずです。getMoreResults()「不明な」SQL ステートメントの処理は、 andgetUpdateCount()をループで呼び出す必要があるため、もう少し複雑です。詳細については、Javadoc を参照してください。

于 2013-02-25T09:36:05.493 に答える
0

機能するストアド関数の作成update ... returning ... into:

create or replace function INC_NEXT_PER_PAGE_REPLY_ID(
  site_id varchar(32), page_id varchar(32), step int) returns int as $$
declare
  next_id int;
begin
  update DW1_PAGES
    set NEXT_REPLY_ID = NEXT_REPLY_ID + step
    where SITE_ID = site_id and PAGE_ID = page_id
    returning NEXT_REPLY_ID into next_id;
  return next_id;
end;
$$ language plpgsql;

そしてそれを次のように呼び出します:

statement = connection.prepareCall(
    "{? = call INC_NEXT_PER_PAGE_REPLY_ID(?, ?, ?) }")
statement.registerOutParameter(1, java.sql.Types.INTEGER)
bind(values, statement, firstBindPos = 2)  // bind pos no. 1 is the return value
statement.execute()
nextNewReplyIdAfterwards = statement.getInt(1)

関連ドキュメント:

于 2013-02-25T09:06:50.147 に答える
0

テーブルに論理順序を含めるには、子テーブル内に複合キーと外部キーを作成する必要がある場合があります。

sd=# create table x (x int);
CREATE TABLE
sd=# create table y (x int, y int);
CREATE TABLE

sd=# alter table x add primary key (x);
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "x_pkey" for table "x"
ALTER TABLE
sd=# alter table y add foreign key (x) references x (x);
ALTER TABLE
sd=# alter table y add primary key (x,y);
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "y_pkey" for table "y"
ALTER TABLE

sd=# insert into x values (1);
INSERT 0 1
sd=# insert into x values (2);
INSERT 0 1
sd=# insert into x values (3);
INSERT 0 1
sd=# insert into y values (1,1);
INSERT 0 1
sd=# insert into y values (1,2);
INSERT 0 1
sd=# insert into y values (1,3);
INSERT 0 1
sd=# insert into y values (1,1);
ERROR:  duplicate key value violates unique constraint "y_pkey" 
DETAIL:  Key (x, y)=(1, 1) already exists.

sd=# select * from x;
 x
---
 1
 2
 3
(3 rows)

sd=# select * from y;
 x | y
---+---
 1 | 1
 1 | 2
 1 | 3
(3 rows)

これで、あなたがなりたい場所にたどり着くはずですか?

于 2013-02-25T14:23:19.490 に答える
0

更新を行っていますが、ステートメントによって結果が生成されるため、executeQuery()代わりにexecuteUpdate(). executeQuery()それが呼び出しの本当の違いResultSetです。whileexecuteUpdate()は、影響を受けた行数のカウントを返します。

于 2014-08-29T07:29:38.160 に答える
0

では、次の構造が必要ですか?:

x = ページの主キー y = コメントの主キー

ページテーブル

x
-
1
2
3
4 etc

コメント表

x y
- -
1 1
1 2
1 3
1 4
2 1
2 2 
2 3
etc?

ここで、子レコードに上限を設けた外部キー構造を持つことが最も理にかなっています。

于 2013-02-24T19:49:41.283 に答える