2016-06-06 4 views
0

여기 순간에 내 코드 날짜와 몇 가지 정규식을 확인 : 내가 무엇을 달성하고자하는PostgreSQL의 제약 -

CREATE TABLE sektors (
id_sektors SERIAL PRIMARY KEY, 
laukuma_nosaukums varchar(100) UNIQUE, 
m2 int CHECK(m2 ~ '^[^0-9]*$') 
datums_no date CHECK(datums_no XXX???), 
datums_lidz date CHECK(datums_lidz XXX???), 
id_koka_veds int NOT NULL REFERENCES koku_veids(id_veids), 
id_audzesanas_veids int NOT NULL REFERENCES audzesanas_veids(id_audzesanas_veids), 
id_senu_veids int NOT NULL REFERENCES senu_veids(id_senu_veids) 
); 

: - 만의 고유 항목

m2를 포함 할 수 있습니다 -

laukuma_nosaukums 수 숫자 만 들어 있니? 이것이 맞으면 Dunno.

datums_no - 어떻게 작성해야할지 모르지만 다음과 같이 원합니다 : 현재 날짜보다 오래된 날짜 만 입력 할 수 있습니다.

datums_lidz -이 사실을 모른다. 나는 이렇게 원합니다 : 나는 현재 날짜로부터 3 개월 이상되지 않은 날짜 만 입력 할 수 있습니다.

+0

해당 데이터 형식 **을 사용하는 요점은 ** 해당 데이터 형식의 잘못된 값을 방지하기위한 **입니다. 'int' 칼럼은 ** 체크섬 제약을 사용할 필요가없는 ** 오직 ** 저장할 수 있습니다. 게다가 :'regex'는 숫자가 아닌 문자열을위한 것입니다. –

+0

오, 아, 알았어. 나랑 데이트 할 수있어? 또한,이 regex : (\ d {6}) \ - (\ d {5})는 XXXXXX-XXXXX에 대한 작업을 수행합니까? 여기서 X는 숫자입니까? –

+0

유효한 숫자는 가운데에'-'를 사용할 수 없습니다. –

답변

0

날짜 필드에 필요한 작업을 수행해야합니다. 중요한 것은 current_date이 아니라 now()을 사용하는 것입니다. 전자는 특수 시스템 변수입니다. 후자는 테이블을 만들 때 평가하여 날짜가 변경되는 즉시 오류를 유도합니다.

create table sektors (
    ... 
    datums_no date 
    CHECK (old_date < current_date), 
    datums_lidz date 
    CHECK (not_old_date <= (current_date + '3 months'::interval)), 
    ... 
); 
+0

'now()'와'current_date'는 아무런 차이가 없습니다. 둘 다 행을 삽입하거나 갱신 할 때만 평가됩니다. (실제로'current_date'는'now() :: date'의 동의어입니다. –