오라클 sql Developer 정리 2일차

홍석진·2021년 4월 6일
0

sql

목록 보기
3/3

제약조건

내가 처음에 공부할 때 이해하기 힘들었던 내용이라 따로 정리를 해보도록 하겠다.

Constraints(제약조건)이란

컬럼에 대한 속성 형태로 정의하지만 엄연히 오라클 데이터 베이스 객체중 하나이며 '데이터 무결성'을 보장하기 위한 용도로 사용한다. 제약조건에는 NOT NULL, UNIQUE, PK, FK, CHECK 등이 있다.

1. NOT NULL

NULL은 값이 없다는 말인데 NOT이 붙어서 널값을 표현하지 않겠다는 뜻을 의미한다.
이 조건에는 컬럼에 insert할때 데이터를 넣지 않으면 오류가 발생.
사용자가 설정한 제약조건은 USER_CONSTRAINTS 시스템 뷰에서 확인가능하다.

2. unique

말 그대로 값이 유일해야한다는 의미, 중복값을 허용하지 않음
UNIQUE 비교대상에서 NULL은 제외 된다 (널값이 입력가능)

컬럼명 데이터타입 UNIQUE -- 생성시

CONSTRAINTS 제약조건명 UNIQUE(컬럼명,...) -- 추가시

3.PK (primary key)

테이블당 한개의 pk를 갖을 수 있고 unique랑 not null 조건을 동시에 포함하고 있다.
구글링중에 기본키에 대한 이해를 높여줄만한 내용을 발견했다.
Primary key란 행을 고유하게 구분해 주는 최소의 정보입니다. 모든 테이블에는 primary key가 있어야 하며, 오직 하나의 primary key만 존재할 수 있습니다. 그리고 그 하나의 primary key는 단일 컬럼으로 구성될 수도 있고 둘 이상의 다중의 컬럼들로 구성될 수도 있습니다. 만일 어떤 하나의 테이블에 primary key 역할을 할 수 있는 컬럼 또는 컬럼들의 그룹이 여러 개 있다면 그 컬럼 또는 컬럼들의 그룹을 candidate key라고 합니다. 하나의 테이블에 여러 개의 candidate key들이 존재할 수 있습니다. 가령 회원 테이블에 각각의 회원에게 고유하게 부여되는 (회원번호) 컬럼과 회원의 (주민등록번호) 컬럼, 그리고 회원이 회원가입 시에 선택하면서 회원별로 고유한 회원의 (로그인ID) 컬럼이 존재한다면 이 테이블에는 세 개의 candidate key가 존재하는 겁니다. 그렇지만 이 세 개의 candidate key 중에서 오직 하나의 candidate key 만이 primary key로 간택(^^) 받을 수 있답니다. 참고로 (회원번호) 컬럼을 primary key로 선택했다면 (회원번호) 컬럼은 회원 테이블의 primary key가 되는 것이고, primary key로 뽑히지 못한 (주민등록번호) 컬럼과 (로그인ID) 컬럼은 alternate key가 됩니다.
어떤 분의 블로그에 "다시 보자 기본키"라는 글이 있어서 한번 들어가 보았더니, 내용인즉슨 "무지 느려서 잘 보았더니 primary key가 없더라, 그래서 primary key를 만들어 주었더니 잘 수행되더라. Primary key의 유무가 무지한 성능 차이를 보이더라"는 내용의 글이었습니다. 여러분들 중에서도 테이블에 primary key를 만들어 주고 나니까 성능이 현저하게 향상되는 경우를 경험하신 분들이 계실 겁니다. 테이블에 primary key를 생성하면 성능이 현저하게 향상되는 것은, primary key를 정의하면 물리적으로 uniqueness를 보장하기 위하여 unique index가 만들어지기 때문입니다. 일반적으로 primary key를 기준으로 데이터를 selecct 한다거나 primary key를 기준으로 다른 컬럼(들)의 값을 update 또는 delete하는 작업이 흔히 수행되기 때문에 테이블에 primary key를 정의해 주면 where 조건절에 primary key가 SARGs(Search Arguments)로 사용된 쿼리들의 성능은 현저하게 향상됩니다.
불행히도, 테이블에 candidate key들이 2,3개나 있음에도 불구하고 primary key를 정의하지 않은 경우들을 간혹 볼 수 있습니다. 그런 경우 primary key를 생성하지 않아서 primary key를 사용하는 쿼리들의 성능이 나쁜 것은 물론이며, 테이블에 잘못된 중복 데이터들이 저장됨으로 인하여 데이터 무결성까지 손상되어 있는 비극적인 상황까지 발전한 경우도 있습니다. 테이블에서 각각의 행들을 고유하게 구분해 주는 컬럼 또는 컬럼들의 그룹을 찾아서 primary key를 만들어 주는 것은 반드시 빠뜨려서는 안되는 매우 기본적인 작업입니다.
여담으로, primary key 컬럼이 반드시 테이블의 첫 번째 컬럼이어야 하는 것은 아닙니다. 테이블을 만들고 나서 보니 테이블의 두 번째 컬럼이 primary key라고 해서 슬퍼하지 않으셔도 됩니다. ^ ^ 그렇지만 관례상 primary key 컬럼을 테이블의 첫 번째 컬럼으로 배치하는 것이 일반적입니다.
CREATE TABLE 명령어를 사용하여 테이블을 만들어 줄 때 꼭 잊지 마십시오. Candidate key 중 하나를 primary key로 정의해야 한다는 것을요. 그리고 다음과 같이 CONSTRAINT 절을 사용하여 primary key를 정의하면 됩니다. 이 때 이름은 여러분의 시스템에서 표준화한 명명 규칙이 있다면 그 명명 규칙을 따라서 여러분이 정하시면 되고, primary key 컬럼(들)을 clustered index로 정할지 아니면 nonclustered index로 정할지는 인덱스 튜닝 기준에 따라 정하면 됩니다.

출처: https://linuxism.ustd.ip.or.kr/503 [linuxism]

컬럼명 데이터타입 PRIMARY KEY -- 생성시

CONSTRAINTS 제약조건명 PRIMARY KEY(컬럼명,...) -- 추가시

4.FK

테이블 간의 참조 데이터 무결성을 위한 제약조건이다.
테이블 끼리 연결시킴.
반드시 참조하는 참조키가 있어야함 👉 참조하는 테이블이 먼저 생성되어야함.
참조키가 참조 테이블의 기본키로 만들어져 있어야함.
FK에 사용할 수 있는 컬럼 갯수는 최대 32개.
여러개의 컬럼을 FK로 설정하려면, 참조하는 컬럼과 FK 컬럼의 순서와 갯수를 같게 해줘야함.

CONSTRAINTS FK명 FOREIGN KEY(컬럼명,...) 

REFERENCES 참조테이블 (참조테이블 컬럼명,...)

5.CHECK

컬럼에 입력되는 데이터를 체크해서 특정 조건에 맞는 데이터만 입력 받고 그렇지 않으면 오류를 리턴

CONSTRAINT 체크명 CHECK (체크조건)

제약조건에는 해당되지 않지만 컬럼 속성 중 하나인 DEFAULT

레코드 입력시 필드값을 전달하지 않으면 자동으로 설정된 기본값을 저장함.

컬럼명 DATE DEFAULT SYSDATE
profile
질문이나 의견이 있으시면 남겨주세요. 서로의 발전이라고 생각합니다.

0개의 댓글