簡體   English   中英

PostgreSQL 和 JDBC:是否支持“UPDATE table ... RETURNING ... INTO”?

[英]PostgreSQL and JDBC: Is `UPDATE table … RETURNING … INTO` supported?

我有一個帶有 [主鍵計數器] 的表,用於 [另一個表中的每頁注釋]。
這些主鍵是每頁的:對於每一頁,評論 ID 從 1 開始。

我想自動分配 10 個 ID 來寫 10 個新評論。
— 我可以用 PostgreSQL 和 JDBC 做到這一點嗎?

(您是否有任何示例/相關 JDBC 文檔的鏈接?)

我只找到了關於如何使用一些getGeneratedKeys returning新插入行的主鍵的示例,這在我的情況下似乎沒有用。

***

我認為 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(對嗎?)。

無需在Statement對象上使用execute()getResult()方法即可支持此操作:

像這樣的東西(不包括任何錯誤處理):

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

正如您知道該語句的作用,這應該沒問題。 處理“未知”SQL 語句有點復雜,因為您需要在循環中調用getMoreResults()getUpdateCount() 有關詳細信息,請參閱 Javadoc。

所以你想要以下結構?:

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?

在這里有一個外鍵結構對子記錄有上限是最有意義的。

創建一個存儲函數,它會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)

相關文檔:

要使表包含邏輯順序,您可能需要在子表中創建一個復合鍵和一個外鍵。

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)

這應該能讓你到達你想去的地方嗎?

您正在執行更新,但語句會生成結果,因此請使用executeQuery()而不是executeUpdate() 這就是調用之間的真正區別: executeQuery()處理產生ResultSet語句; executeUpdate()返回受影響的行數的計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM