2011-08-04 61 views
10
select uuid_generate_v4() as one, uuid_generate_v4() as two; 

「one」uuid和「two」uuid是相等的!postgreSQL uuid代

CREATE TABLE "TB" 
(
    "Id" uuid NOT NULL DEFAULT uuid_generate_v4(), 
    "Title" character varying NOT NULL, 
    CONSTRAINT "TB_Class_ID" PRIMARY KEY ("Id") 
); 

的PostgreSQL 9.0的pgAdmin 1.12.3

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 

insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 

結果:

ERROR: duplicate key value violates unique constraint "TB_Class_ID" 
DETAIL: Key ("Id")=(12ab6634-995a-4688-9a9a-ee8c3fe24395) already exists. 

postgreSQL maestro 9.2.0.4

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 

結果:1行受影響;

據我所知,藝術大師逐個添加記錄,但爲什麼uuid_generate_v4()在兩次調用後返回相同的值? (在pgAdmin的情況下)。

如何通過一個請求添加多行?

+0

這看起來像是一個bug。嘗試'SELECT random()AS one,random()AS two;'。我得到兩個不同的值,不管我是否在交易中。 'uuid_generate_v4'是'VOLATILE'函數,所以我認爲錯誤在於uuid-ossp模塊或底層庫。 –

+1

是「SELECT random()AS one,random()AS two」獲取不同的值,我不明白爲什麼uuid_generate_v4得到相同的值 –

回答

11

在給定的事務中,函數uuid_generate_v4()返回相同的值。

當語句組合在一起並作爲「一個命令」運行時,有一個事務,因此每次調用uuid_generate_v4()時都會返回相同的值。

兩個方法來「解決」這個是:

  1. 讓您每次使用的功能(這是最簡單的)
  2. 使用非自動提交連接,你控制交易時間單獨的數據庫調用和分離BEGIN; COMMIT對中每次使用(這是一個麻煩 - 不這樣做,除非你有)
+0

非常感謝波希米亞人 –

+4

只是FYI給所有來自Google或任何人的人,但我不要認爲這是一個錯誤或問題了。 「選擇uuid_generate_v4()作爲一個,uuid_generate_v4()作爲兩個」在我的PostgreSQL 9.3/9.4安裝中正常工作。就像@ peter-eisentraut說的那樣,它可能是一個早已修復的bug。 –

0
begin ISOLATION LEVEL READ UNCOMMITTED; 
insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 
commit; 

它可能太

13

在過去的某個時間,uuid_generate_*函數被錯誤地標記爲IMMUTABLE,這會導致您顯示的行爲。這已在所有最新的次要版本中修復,但您必須重新運行安裝腳本(uuid-ossp.sql)以獲取更新的函數定義。 (您也可以查看安裝腳本來驗證您是否具有最新版本,這些功能應標記爲VOLATILE。)

+1

我取代IMMUTABLE揮發性在'UUID-ossp.sql' '選擇uuid_generate_v1()爲一體,uuid_generate_v4()作爲two' 給出兩個不同的結果,但 '插入到 「TB」( 「ID」, 「標題」)值(uuid_generate_v4(),'111'); 插入「TB」(「Id」,「Title」)值(uuid_generate_v4(),'111'); ' 繼續給出「重複鍵」錯誤 –

+1

上面顯示的表定義甚至沒有唯一的約束,因此您沒有告訴我們完整的真相。 –

+0

對不起,發佈更新'CONSTRAINT「TB_Class_ID」PRIMARY KEY(「Id」)' –