2013-05-30 4 views
1

저는 Postgres를 처음 사용하고 있으며 pgAdmin III를 사용하여 테이블 (metrics_reaches)을 작성하고 있습니다.Postgres LIKE 고유 제한이 있습니까?

내 테이블에는 insertion_timestamp타임 스탬프가있는 유형 열이 있습니다.

UNIQUE 제약을 만들고 싶습니다. 다른 필드 중에서도 insertion_timestamp의 날짜 부분 만 확인하고 시간은 확인하지 않아야합니다.

할 방법이 있습니까? 지금 내 스크립트가 어떻게 생겼는지 보여줍니다 (마지막 CONSTRAINT 참조).

-- Table: metrics_reaches 

-- DROP TABLE metrics_reaches; 

CREATE TABLE metrics_reaches 
(
    organizations_id integer NOT NULL, 
    applications_id integer NOT NULL, 
    countries_id integer NOT NULL, 
    platforms_id integer NOT NULL, 
    ... 
    insertion_timestamp timestamp with time zone NOT NULL, 
    id serial NOT NULL, 
    CONSTRAINT metrics_reaches_pkey PRIMARY KEY (id), 
    CONSTRAINT metrics_reaches_applications_id_fkey FOREIGN KEY (applications_id) 
     REFERENCES applications (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT metrics_reaches_countries_id_fkey FOREIGN KEY (countries_id) 
     REFERENCES countries (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT metrics_reaches_organizations_id_fkey FOREIGN KEY (organizations_id) 
     REFERENCES organizations (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT metrics_reaches_platforms_id_fkey FOREIGN KEY (platforms_id) 
     REFERENCES platforms (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT metrics_reaches_organizations_id_key UNIQUE (organizations_id, applications_id, countries_id, platforms_id, insertion_timestamp) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE metrics_reaches 
    OWNER TO postgres; 

답변

1

캐스팅 (TRY) :

CONSTRAINT metrics_reaches_organizations_id_key UNIQUE (
    organizations_id, 
    applications_id, 
    countries_id, 
    platforms_id, 
    CAST(insertion_timestamp AS date) 
) 
+0

프랭크의 대답에 대한 코멘트가 여기에 적합하지 않으므로 별도의 답변으로 게시됩니다. –

1

이 정말 프랭크의 대답에 의견이지만 코멘트 상자 너무 오래입니다. 당신이 과민 반응하는 경우 날짜를 처리 할 때

,주의 깊게 로컬 시간대를 볼 필요 캐스트 : PG, 이것은 문제가 알고 똑똑 이제

bookings=> SET timezone='GMT'; 
SET 
bookings=> SELECT now() at time zone 'GMT', (now() at time zone 'GMT')::date, now(), now()::date; 
     timezone   | timezone |    now    | now  
---------------------------+------------+------------------------------+------------ 
2013-05-30 19:36:04.23684 | 2013-05-30 | 2013-05-30 19:36:04.23684+00 | 2013-05-30 
(1 row) 

bookings=> set timezone='GMT-7'; 
SET 
bookings=> SELECT now() at time zone 'GMT', (now() at time zone 'GMT')::date, now(), now()::date; 
      timezone   | timezone |    now    | now  
----------------------------+------------+-------------------------------+------------ 
2013-05-30 19:36:13.723558 | 2013-05-30 | 2013-05-31 02:36:13.723558+07 | 2013-05-31 

을 당신이 만들려고하면 당신이 그때는 정말 불변 당신이 당신의 제약 조건을 가질 수있다 "시간대에"적용 후 캐스팅하려고하면

ERROR: functions in index expression must be marked IMMUTABLE 

: 날짜 캐스트와 제약 조건은 다음과 같은 것을 볼 수있다.

물론 다른 옵션은 함수에서 캐스트를 래핑하고 함수를 불변으로 표시하는 것입니다. 그런 식으로 시스템에 거짓말을한다면 데이터베이스가 1 년 후 이상하게 작동 할 때 불평하지 마십시오.