2011-01-03 3 views
0

메신저 메신저 PostgreSQL에, 어떤 조건이 보유하고있는 경우 일부 tuples을 삭제할 수없는 방법이 있습니까? 구체적으로, 내가 있다고 가정조건에 NOT NULL 제약 조건을 사용할 수 있습니까? PostgreSQL에

표 남성 (Name_A, 직업)

표 학생 (Names_B, Date_birth) Names_B가 Names_A을 참조하는 경우

, 내가 어떻게 만 Names_A가 있는지 확인 할 수 " 삭제할 수 없음 "누구의 Date_birth ="xx/yy/zz "

죄송합니다. 내가 그것을 명확하게 설명 할 수 없다면, havnt는 이것을 작성하기 위해 NOT NULL 제약 조건을 사용하는 DDL에서 아무 것도 발견하지 못했습니다.

미리 도움을 청하십시오!

+2

무엇 "삭제할 수 없다"는 뜻입니까? NOT NULL 제약 조건은 삭제할 수있는 기능과 아무 관련이 없습니다. –

+0

다른 Date_birth 값을 가진 다른 행을 삭제할 수 있지만 특정 Date_birth 행을 삭제하려는 시도는 거부됩니다. – Newbie123

+0

삭제 작업을 수행하는 트리거로이 작업을 수행 할 수 있으며 그 값 일치해라. –

답변

1
CREATE FUNCTION protect_delete() RETURNS trigger 
LANGUAGE plpgsql 
AS $$ 
BEGIN 
    IF OLD.date_birth = 'xx/yy/zz' THEN -- don't actually use this date format 
     RETURN NULL; -- don't delete 
    ELSE 
     RETURN OLD; 
    END IF; 
END; 
$$; 

CREATE TRIGGER protect_delete BEFORE DELETE ON students FOR EACH ROW 
    EXECUTE PROCEDURE protect_delete(); 
+0

답장을 보내 주셔서 감사합니다. :) – Newbie123

+0

또는'RAISE '이 행을 삭제하는 것이 허용되지 않음'대신 RETURN NULL을 사용합니다. – araqnid

0

트리거 작성에 대한 정보는 Postgres trigger documentation을 참조하십시오. 행 레벨 트리거가 필요한 것처럼 들립니다.

"작업 이전에 실행 된 행 수준 트리거는 ... 현재 행에 대한 작업을 건너 뛰려면 NULL을 반환 할 수 있습니다. 이렇게하면 실행 프로그램이 트리거를 호출 한 행 수준 작업을 수행하지 않도록 지시합니다 (삽입 또는 수정)

따라서 조건에 대한 트리거 테스트에서 삭제를 방지하려면 null을 반환하고 삭제 행을 계속하려면 트리거 행을 반환하십시오.

0

당신은 PostgreSQL의 규칙을 사용할 수 있습니다

create rule rule_test as 
    on delete to test 
    -- old is a reference to your table 
    where old.birth = '2011-1-1' -- or whatever condition you want 
    do instead nothing; 

한이 빨리이 쿼리 자체를 수정하고 각 행을 확인하는 대신 조건 쿼리를 다시 작성하기 때문에 실행할 수있는 큰 테이블. 규칙을 만들

+0

답장을 보내 주셔서 감사합니다. :) – Newbie123

관련 문제