Null
null 은 알지 못하는 값, 존재하지 않는 값을 명시적으로 나타내는 값이다.
만약 어떤 직원이 퇴사하면서 데이터가 삭제되면 그 직원의 피부양자가 모두 삭제되도록 구현하는 테이블이 있다고 해보자.
이때 실제로 데이터를 지우는 Hard Delete 방식 외에도, 그냥 피부양자에 대한 내용을 null 로 바꿈으로서 지우는 Soft Delete 방식을 적용할 수도 있다.
다만 Null 값을 사용할 때는 PK 에 null 이 들어갈 수 없다는 것만 기억하자.
따라서 테이블을 설계할 때, PK에는 별도의 제약조건을 명시히지 않아도, 기본적으로 NOT NULL 제약조건이 걸린다.
General Constraint
무결정 제약조건을 걸 때, 키 제약조건, 널 제약조건, 참조 제약조건 등 다양한 제약 조건을 걸 수 있다.
만약 rating 값에 대해 이 값의 '범위'를 제약조건으로 걸고 싶다면 어떻게 할 수 있을까?
이런 일반적인 제약조건을 걸 때는 테이블 제약조건을 걸면 된다.
이때는 CHECK 라는 키워드를 사용한다.
위와 같이 특정 컬럼에 대해서 값의 범위를 제약하도록 명시할 수도 있고,
이렇게 SQL을 사용하여 그 결과와의 비교를 통한 제약을 추가할 수 있다.
CONSTRAINT 키워드는 이 제약 조건에 대해 이름을 부여하는 키워드이다.
CHECK 키워드를 사용하여 제약조건을 추가할 때는 그림과 같이 여러 SQL의 실행결과를 합쳐서 제약조건을 걸 수도 있다.
위 그림은 보트 테이블의 행 개수와 선원 테이블의 행 개수의 합이 100 미만이어야 한다는 조건을 걸고 있다.
이 방법에는 2가지 문제가 있는데,
첫 번째는 선원에 대한 제약조건인데 보트 테이블이 관련되어있다는 점이고,
두 번째는 만약 선원이 아무도 없다면 그 상태에서 보트의 개수는 100개를 넘어갈 수 있다는 점이다.
(왜냐하면 이 제약조건은 선원 테이블에 데이터를 넣을 때 발생하는 제약이므로, 보트에 데이터를 넣을 땐 제약이 발생하지 않는다.)
따라서 이 문제를 해결하려면 이 제약조건 자체를 외부로 빼내는 것이 좋다.
그리고 그 키워드가 CREATE ASSERTION 키워드이다.
트리거
트리거는 이벤트가 발생했을 때, 특정 조건에 부합하면 정해진 액션을 수행하는 것을 말한다.
따라서 트리거는 Event, Condition, Action 으로 구성되며, 이들을 줄여서 ECA 라고도 부른다.
예를 들면 위와 같은 트리거를 작성할 수 있따.
이 트리거의 이벤트 발동 시점은 sailors 테이블에 데이터가 추가된 이후에 발생하며,
그 추가된 데이터들의 집합에 대해 NewSailors 라고 정의를 하고 다음의 SQL을 실행한다.
실행하는 SQL은 YoungSailors 라는 테이블에 NewSailors 로 추가된 선원 중 나이가 18세 이하인 선원을 똑같이 추가하는 구문이 실행된다.
'CS > 기초데이터베이스' 카테고리의 다른 글
[데이터베이스] 17. 하드 디스크와 SSD의 구조 (0) | 2024.10.22 |
---|---|
[데이터베이스] 16. 분산 데이터베이스 (1) | 2024.10.21 |
[데이터베이스] 14. SQL 집계 함수와 Group By (0) | 2024.10.21 |
[데이터베이스] 13. SQL 서브 쿼리 (0) | 2024.10.21 |
[데이터베이스] 12. SQL 기본 쿼리 (0) | 2024.10.20 |