2013-04-08 2 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

Смежные вопросы