2014-07-22 97 views
1

拉力賽DB新手問題:數據庫:從多服務器插入

我試圖插入用戶記錄到數據庫。 id類型可以是自動增量序列或INT。

如何插入帶有唯一ID的記錄,並且可以返回該ID,確保如果請求由多個應用程序服務器處理,那麼我不會生成重複的ID。

例如

  • 服務器1只需要插入:( '約翰', '史密斯',25)
  • 服務器2只需要插入:( '約翰', '藍波',25)

的應用程序服務器需要將生成的記錄的標識返回。我不能做基於屬性,因爲

  1. 他們可能是重複
  2. 它是昂貴的一個選擇。

一個解決方案是,每個應用程序服務器還插入服務器ID,服務器更新號,組合,然後在此基礎上進行選擇。

我覺得這應該是一個普遍的問題,會有一個更簡單的解決方案。

我使用PostgreSQL如果它很重要。

+1

哈,如果僅僅是一些常見的和通用的問題的意思SQL中有一個標準的解決方案。 'LIMIT'和'OFFSET'。或者是upsert問題。 –

回答

3

在Postgres可以使用RETURNING子句返回這樣的列的值作爲

INSERT INTO表(COL1,COL2,COL3)VALUES(1,2,3)RETURNING ID;

+0

哈哈,我應該感到愚蠢嗎?這很好。 – 0fnt

+2

這不是SQL標準的一部分,但很方便知道您是否使用postgres;) – Lucas

+0

再次感謝!我打算將此標記爲答案,但如果有人有更「標準」的答案,請稍等一下。 – 0fnt

2

您沒有提及您使用的語言和工具。這很重要,因爲標準並沒有真正涵蓋這一點,但許多客戶端平臺都有自己的抽象。

特別是JDBC有Statement.getGeneratedKeys()Statement.RETURN_GENERATED_KEYS

我不認爲在ODBC接口中有任何等價物。我沒有找到一個快速搜索,但發現一些供應商將其添加爲擴展。

對於其他客戶,這取決於您使用的是什麼。一些ORM層有它們自己的處理,例如, Hibernate(和其他JPA實現)處理密鑰生成,ActiveRecord(blech),SQLAlchemy等。

否則,正如盧卡斯所說,您可以使用PostgreSQL擴展RETURNING the_key_column_names_here。 (9.5應該有希望加上RETURNING PRIMARY KEY)。

(SQL規範提供了GENERATED ALWAYS但據我所知,沒有標準的方式返回值。許多數據庫不實施GENERATED反正。)

+0

我正在使用Scala + ORM + JDBC + Postgre。盧卡斯的解決方案在psql命令行中工作,沒有檢查它是否可以在我的項目中工作。 – 0fnt

+0

@ user247077如果您使用的是PgJDBC,請*使用getGeneratedKeys的JDBC標準方法。如果你的ORM實際上沒有爲你做這件事,我會感到驚訝。哪個ORM? –

相關問題