홈>
삽입 될 행이 다른 테이블에 있는지 확인하는 트리거를 작성하려고합니다.
기본적으로 2 개의 테이블은 하나의 열 ID를 공유합니다. 새 행이 다른 테이블에 한 번 이상 존재하지 않으면 삽입을 방지하고 싶습니다.
이것이 있습니다 :
create or replace trigger BIM
before insert on TABLE1
for each row
begin
if not exists (select 1 from TABLE2 where TABLE2.ID = :new.TABLE1.ID)
then
raise_application_error(-20634, 'Error');
end if;
end;
그러나 나는 이것을 얻는다 :
PLS-00049: bad bind variable 'NEW.TABLE1'
-
답변 # 1
-
답변 # 2
테이블 이름을 반복하지 않아도됩니다 :
create or replace trigger BIM before insert on TABLE1 for each row begin if (select 1 from TABLE2 where TABLE2.ID = :new.ID and rownum = 0) is not null then raise_application_error(-20634, 'Error'); end if; end;
이것은 이상한 요구 사항이다. 외래 키 제약 조건을 사용하는 것이 좋지만 명시 적으로 "적어도 한 번"이라고 말합니다. 그것은 당신이 나쁜 데이터 모델을 가지고 있다고 의심하게 만듭니다-당신은
id
가있는 일종의 엔티티가 빠져 있습니다. 해당 테이블의 기본 키가됩니다.
관련 질문
- 오라클 SQL 최대 값
- sql - Oracle의 함수 별 반환 테이블에서 열 선택
- sql - 오라클 데이터베이스에서 필터 쿼리를 사용하는 방법
- sql - 오류 ORA-00904가있는 Oracle 11g 업데이트 문
- oracle - SQL에서 하나 이상의 관련없는 조건을 확인하는 방법은 무엇입니까?
- sql - 여러 SELECT 문이있는 사례
- sql - PLSQL에서 json을 필터링하는 방법은 무엇입니까?
- sql - 기간 사이에 Oracle에서 쿼리
- sql - Oracle DB에서 시작하고 끝나는 테이블 이름 분류
- sql - Oracle varchar2 및 유니 코드 텍스트
고든이 맞습니다.이 시나리오에서는 외래 키 제약 조건을 사용하는 것이 좋습니다.
Gordon이 지적한 오류를 제외하고 코드 문제는 Postgres와 같은 다른 DBMS와 달리 Oracle에서
EXISTS
를 사용할 수 없다는 것입니다IF
와 같은 PL/SQL 표현식/문에서 . 순전히 SQL 문이어야합니다.DEMO