2017-09-06 61 views
0

當插入到字符串和日期唯一約束的PostgreSQL數據庫中時,字符串部分的精確匹配未被使用。如下所示,當我嘗試將'AA','2010-01-04'組合插入到數據庫中時,我得到A,2010-01-04已存在的重複衝突。PostgreSQL的唯一約束不使用完全匹配

INSERT INTO orats_opt 
(ticker,dates,stockpx,iv30,iv60,iv90,m1atmiv,m1dtex,m2atmiv,m2dtex,m3atmiv,m3dtex,m4atmiv,m4dtex,slope,deriv,slope_inf,deriv_inf,dclsHV10,dclsHV20,dclsHV60,dclsHV120,dclsHV252,dORHV10,dORHV20,dORHV60,dORHV120,dORHV252) 
VALUES ('AA','2010-01-04 
+00'::date,16.63,47.68,43.25,43.16,52.34,12.0,43.28,47.0,43.15,103.0,43.08,194.0,2.28,0.03878,2.323,0.05939,45.21,47.01,45.15,47.52,71.41,41.94,49.32,44.63,47.31,60.38) 
ERROR: duplicate key value violates unique constraint "unique_ticker_date" 
DETAIL: Key (ticker, dates)=(A, 2010-01-04) already exists. 
********** Error ********** 

ERROR: duplicate key value violates unique constraint "unique_ticker_date" 
SQL state: 23505 
Detail: Key (ticker, dates)=(A, 2010-01-04) already exists. 
+2

請** [編輯] **你的問題,並添加完整'創建table'爲'orats_opt'和相應的唯一約束(或指數)語句。 ** [編輯] **你的問題。請不要**在註釋 –

+1

表中添加代碼或附加信息,最好從psqls'\ d + orats_opt' –

+0

或許'ticker'被定義爲'char(1)'。 –

回答

1

我立即猜測,基於行爲和缺乏其他錯誤的,那是你唯一約束搞砸。例如,如果您錯誤地試圖在獨特的約束中投射這些項目並且弄錯了,那麼您可能會創建錯誤的唯一鍵。一個很好的例子可能是,如果你在你的表定義有:

unique("char"(ticker), date(dates)) 

或者,如果您具有設置門票"char"(ticker)觸發這會導致相同的。

但是默認情況下,唯一的約束在最後用_key命名,所以這聽起來像是一個自定義索引。下面也可以創建這個:

create unique index unique_ticker_date("char"(ticker), date(dates)) 

可能會有同樣的效果。

要修復它嘗試:

drop index unique_ticker_date; 
create unique index unique_ticker_date on orats_opt(ticker, dates);