2013-06-07 2 views
0

내가 찾고있는 것은 기존 테이블에 제약 조건 (예 : 고유)을 추가하고 기존 데이터에 대해 유효성을 검사 한 다음 제약 조건을 제거 할 때 관찰했던 것과 같은 동작입니다. 제약 조건을 테이블에 유지하고 싶지는 않습니다. 단지 표현하고, 기존 데이터에 대해 유효성을 검사 한 다음 계속 진행합니다 (또는 실패한 경우 예외를 발생시킵니다). PostgreSQL (9.2)는 이러한 종류의 작업을 직접 수행 할 수 있습니까?PostgreSQL에서 엔터티에 추가하지 않고 제약 조건을 표현하고 확인할 수 있습니까?

alter table t 
drop constraint the_pk; 

당신도 몇 시간 동안을 유지하지 않으려면 다음 트랜잭션 내에서 그것을 할 : 오류가 드롭하지가 있었다면

alter table t 
add constraint the_pk primary key (user_id); 
NOTICE: ALTER TABLE/ADD PRIMARY KEY will create implicit index "the_pk" for table "t" 
ERROR: could not create unique index "the_pk" 
DETAIL: Key (user_id)=(1) is duplicated. 

:

+3

당신은 "조건"을 위반하는 행을 카운팅'select' 문을 사용할 수 있습니다. 예 : 'group by '과'counting (*)> 1'을 포함하는 고유 한 제약 조건 –

+0

@a_horse_with_no_name에 대한 제안에 감사드립니다. 제약 조건을 위반하는 경우 (예 : CASE ... 구문 상 유효하지 않은 최상위 브랜칭) 예외를 throw하는 등 어떻게해야합니까? 절차 언어를 사용해야합니까? – BlueBomber

답변

2

제약 조건을 만들기 예 :

rollback; 
1

설정 :

CREATE TABLE testu (id integer); 
INSERT INTO testu SELECT generate_series(1,100); 
INSERT INTO testu VALUES (1),(10),(20); 

데모 쿼리 찾기 위해 가능한 문제 행 :

regress=> select id, count(id) FROM testu GROUP BY id HAVING count(id) > 1; 
id | count 
----+------- 
20 |  2 
    1 |  2 
10 |  2 
(3 rows) 

DO 블록에 랩 :

DO 
$$ 
BEGIN 
    PERFORM id FROM testu GROUP BY id HAVING count(id) > 1 LIMIT 1; 
    IF FOUND THEN 
        RAISE EXCEPTION 'One or more duplicate IDs in table testu'; 
    END IF; 
END; 
$$ LANGUAGE plpgsql; 

당신이 개인을보고 싶다면 당신이 할 수있는 충돌 ID 에서 쿼리 결과에서 문자열을 작성하여 결과를 반복하고 NOTICE 등을 발생시켜 다양한 옵션을 사용할 수 있습니다. PL/PgSQL 문서를 통해 독자 여러분에게 연습 문제로 남겨 둘 것입니다.

1

IF EXISTS은 plpgsql 일반적으로 간단하고이 목적을 위해 빠른 :

DO 
$$ 
BEGIN 
    IF EXISTS (SELECT 1 FROM tbl GROUP BY tbl_id HAVING count(*) > 1) THEN 
     RAISE EXCEPTION 'Duplicate "tbl_id" in table "tbl"!'; 
    END IF; 
END 
$$ LANGUAGE plpgsql;