2013-04-08 183 views
2
CREATE TABLE foo (
    dt AS DATE, 
    ts AS TIMESTAMP 
); 

什么是创造一个独特的约束,其中的ts日期值每dt发生一次的正确方法的类型转换;例如:SQL:唯一索引

dt   | ts 
2010-01-02 | 2010-01-02 17:19:08 
2010-01-02 | 2011-11-11 01:01:01 
2010-01-02 | 2011-11-11 17:19:08 -- would error on insert (already a 2011-11-11) 

尝试:

  1. 无效的语法,但我想要实现:

    CREATE UNIQUE INDEX unique_tsdate_per_dt ON foo(dt,ts::date); 
    
  2. 不完整的企图 - 可能是子查询?

    CREATE UNIQUE INDEX unique_tsdate_per_dt ON foo(dt) WHERE ts::date -- ? 
    

回答

1

我认为你正在寻找的::date投的函数形式:

CREATE UNIQUE INDEX unique_tsdate_per_dt ON foo(dt, date(ts)); 

你将得到的结果是这样的:

=> insert into foo (dt, ts) values ('2010-01-02', '2010-01-02 17:19:08'); 
=> insert into foo (dt, ts) values ('2010-01-02', '2011-11-11 01:01:01'); 
=> insert into foo (dt, ts) values ('2010-01-02', '2011-11-11 17:19:08'); 
ERROR: duplicate key value violates unique constraint "unique_tsdate_per_dt" 
DETAIL: Key (dt, date(ts))=(2010-01-02, 2011-11-11) already exists. 
+0

我的下一个测试是尝试'cast()',但是'date()'将工作 - thx – vol7ron 2013-04-09 00:29:35