2013-02-24 78 views
0

我有[主鍵計數器]表[每頁在另一個表中的評論]表。
這些主鍵是每頁:每個頁,評論的ID開始在1PostgreSQL和JDBC:是否支持`UPDATE table ... RETURNING ... INTO`?

我想原子分配10點的ID寫了10層新的意見。
- 我可以使用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(對吧?)。

+0

爲什麼你需要每頁評論ID呢?爲什麼不使用每個評論ID和外鍵返回頁面? – 2013-02-24 19:29:01

+0

@ muistooshort ID會變得相當大。但是它們應該是短連續的數字,所以我可以在[bitset]中使用它們作爲索引(http://www.scala-lang.org/api/current/index.html#scala.collection.BitSet) 。 – KajMagnus 2013-02-24 19:34:39

+0

((我會試試這個:http://stackoverflow.com/a/881414/694469)) – KajMagnus 2013-02-24 19:45:24

回答

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? 

這裏有一個外鍵結構是最有意義的這是兒童記錄的上限。

+0

是你的*評論表*插圖是按照預期。 - 外鍵結構是指「畝太短」的評價方法?也就是說,*「每個評論ID和外鍵返回頁面」*? – KajMagnus 2013-02-24 19:57:38

+0

我不明白這是什麼意思:「兒童記錄上限」? – KajMagnus 2013-02-24 19:57:58

+0

是的,我的意思是說結構是最好的選擇。你應該有父子關係,但對孩子也有限制,所以每個父行只能有10行。 – d1ll1nger 2013-02-24 21:20:53

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) 

相關文檔:

3

這是在不使用Statement對象上的​​和getResult()方法支持你知道聲明做什麼,這應該是確定的。處理「未知」SQL語句有點複雜,因爲您需要在循環中調用getMoreResults()getUpdateCount()。有關詳細信息,請參閱Javadocs。

+0

謝謝!我實際上是要測試這樣的東西 - 也就是'execute()'而不是'executeUpdate()'。我首先這樣做了,但認爲'executeUpdate()'是調用的方法(因爲我找到了其他答案),並且這不起作用,因此我使用了存儲函數。但你的解決方案更好 - 我寧願避免存儲功能。今天晚些時候我會試試這個。 – KajMagnus 2013-02-25 11:16:06

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) 

這應該讓你想要在哪裏?

+0

嗨戴爾!感謝您的回答!已經有一個子頁面,其中包含父表的外鍵以及主鍵,就像您描述的那樣。我的問題是關於如何在子頁面中生成每頁評論ID,所以ID從1開始(每頁),並且是連續的(每頁)。 - 我認爲這個答案並不是真正的相關,但更多的是關於SQL和外鍵的。無論如何, – KajMagnus 2013-02-25 15:57:49

+0

(我已經有一個工作的解決方案,使用存儲的函數。此外,「a_horse_with_no_name」建議「純粹」更新(沒有任何存儲函數),我可能會稍後嘗試 - 除此之外,從我的角度來看,這個問題已經解決了。) – KajMagnus 2013-02-25 15:59:44

0

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

相關問題