홈>
삽입 될 행이 다른 테이블에 있는지 확인하는 트리거를 작성하려고합니다.
기본적으로 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 : 프로시저는 if 및 else 조건을 모두 충족하는 데이터를 반환합니다.
- ORA-00933 sql 명령이 제대로 종료되지 않았습니다(인서트 쿼리에서)
- 모든 레code를 보기 위해 Oracle SQL Developer에서 버퍼 크기를 늘리는 방법은 무엇입니까?
- sql : sysdate의 반환 유형이 DATE인 이유는 무엇입니까?
- 환율을 가져오는 SQL 쿼리
- Oracle SQL 쿼리가 실행되지 않음
- SQL의 여러 테이블에서 불일치 데이터를 쿼리하는 방법
- sql : Oracle에서 구체화된 뷰를 한 DB 서비스 이름에서 다른 이름으로 복사/이동하는 방법이 있습니까?
- sql : 날짜 함수 Trunc(SysDate)
- SQLPlus 프로그램에서 Oracle 동시 요청 출력/로그에 쓰기
고든이 맞습니다.이 시나리오에서는 외래 키 제약 조건을 사용하는 것이 좋습니다.
Gordon이 지적한 오류를 제외하고 코드 문제는 Postgres와 같은 다른 DBMS와 달리 Oracle에서
EXISTS
를 사용할 수 없다는 것입니다IF
와 같은 PL/SQL 표현식/문에서 . 순전히 SQL 문이어야합니다.DEMO