(제약에서) 예외 또는 트리거를? 나는 둘 다 말하지 않는다.
강력하게은 응용 프로그램 코드와 쿼리를 사용하여 트리거 및 제약 조건과 달리 응용 프로그램의 논리를 사용하는 것이 좋습니다. 논리를 오류 조건 처리와 분리하면 코드의 동작이 더 마술처럼 보일뿐입니다.
제약 조건은 백업 계획 (응용 프로그램 논리 오류 또는 변경의 경우)으로 매우 유용하지만 사용자가 원하는 방식으로 런타임 오류 처리를 지원하지 않는다는 점에서 옳습니다 (즉, 노출하는 데 도움이되지 않음) INSERT
문이 사용하려고했던 중복 키).
의심의 여지가 없으므로 트리거를 사용하여 설명하는 것을 매우 쉽게 수행 할 수 있지만 궁극적으로는 동일한 논리적 테스트 ("이 레코드가 이미 존재합니까?")를 단순히 숨기고 있다는 것입니다. 트리거에서 응용 프로그램 코드 (예 : INSERT
문이 존재하는 곳)와 반대입니다. 테이블에 여러 개의 트리거가있는 경우 도 불필요하게 실행하는 오버 헤드를 거치게됩니다. 처음에는 오류가 발생하고 다른 하나는 아무 효과가 없었을 것입니다.
당신은 추가적인 문을 작성하지 않으려면 미리 확인 새 INSERT
문을 실행하기 전에 데이터의 상태를, 나는이 같은 것을 사용하는 것이 좋습니다 것입니다 : 적어도 다음
INSERT INTO my_table (col1, col2)
SELECT l_val1, l_val2
FROM dual
WHERE NOT EXISTS (
SELECT 1
FROM my_table t
WHERE t.col1 = l_val1
AND t.col2 = l_val2
)
을하면됩니다 키를 위반하지는 않지만 SQL%ROWCOUNT
이 0 (삽입 된 행이 없으므로 이미 존재해야 함)인지 또는 1을 테스트하여 행이 이미 있는지 여부를 알 수 있습니다.
그러나 여전히 키 위반을 제공하지는 않습니다 값. 어떤 제약 조건을 위반하는지 알아 내려면 쿼리를 작성해야합니다.
출처
2012-11-27 00:42:18
Ben
삽입 문은 여전히 어떤 열의 복제가 발생했는지 알려주지 않습니다. – user1831003
아니, 그건 사실이야. 당신은 그것을 다시 질문해야 할 것입니다. – Ben