2017-09-06 71 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);