2017-09-06 12 views
0

文字列と日付に固有の制約を持つPostgreSQLデータベースに挿入するとき、文字列部分の完全一致は使用されていません。以下に示すように、「AA」、「2010-01-04」の組み合わせをDBに挿入しようとすると、すでに存在する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

をしてくださいと '' orats_opt'と対応する一意制約(またはインデックス)のためtable'文を作成し、完全なを追加します。試してくださいそれを修正するには

。 **あなたの質問。 **は**コメントでコードや追加情報を追加しないでください –

+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); 
関連する問題