알파벳 문자로 시작
. 0-9, A-Z, $, #, _ 사용 가능.30자
초과 불가능, 예약어
사용 불가능제약조건이란?
=> 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 여러가지 규칙을 적용해 놓는 것이라 생각하면 됨.
간단하게 말하면 테이블 안에서 데이터의 성격을 정의하는 것.
데이터의 무결성 유지
를 위해서 사용자가 지정할 수 있는 성질ALTER
) 명령어를 통해서도 추가 가능하다.컬럼을 필수 필드화 시킬 때 사용.
-- emp3라는 테이블을 만들고, ename 컬럼의 제약조건명을 emp_nm_ename 으로 하여 NOT NULL 제약조건을 설정하자.
SQL> CREATE TABLE emp3(
ename VARCHAR2(30) CONSTRAINT emp_nm_enmae NOT NULL
);
-- 제약조건을 확인할 때는 USER_CONSTRAINTS 뷰를 통해서 확인할 수 있다.
SQL> SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMP3';
CONSTRAINT_NAME
-----------------------
emp_nn_ename
유일성
을 보장(=> 중복되는 데이터가 존재할 수 없음
)하고, 자동으로 인덱스가 생성.-- EMP2 테이블을 생성한 뒤, ALTER 를 이용해서 제약조건을 추가해준다. (제약조건명 : EMP2_UK_DEPTNO)
ALTER TABLE EMP2
ADD CONSTRAINT EMP2_UK_DEPTNO UNIQUE(deptno);
-- 제약조건을 삭제한다.
ALTER TABLE EMP2
DROP CONSTRAINT EMP2_UK_DEPTNO;
✅ 테이블 생성 후 제약조건 설정시
제약조건의 추가 & 삭제시 둘다ALTER
를 이용 !
추가는 ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명
삭제는 ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명
특정 범위로 제한
-- EMP2 테이블의 comm 컬럼이 1~100 까지의 값만 가질 수 있도록 체크 제약조건 생성.
ALTER TABLE EMP2
ADD CONSTRAINT EMP2_CK_COMM CHECK (comm >= 1 AND comm <= 100);
-- 제약조건 삭제
ALTER TABLE EMP2
DROP CONSTRAINT EMP2_CK_COMM;
-- 10000, 20000, 30000, 40000, 50000 의 값만을 가질 수 있는 체크 제약조건 생성.
ALTER TABLE EMP2
ADD CONSTRAINT EMP2_CK_COMM2 CHECK comm IN (10000,20000,30000,40000,50000);
-- hiredate 컬럼에 값을 입력하지 않아도 오늘 날짜가 입력된다.
SQL> CREATE TABLE emp4(
... (컬럼생략) ...,
hiredate DATE DEFAULT SYSDATE );
UNIQUE
+ NOT NULL
의 결합과 같음.참조 무결성
기본키를 정의하면 자동으로 인덱스를 생성
, 그 이름은 기본 키 제약조건의 이름과 같다.✅ INDEX
: 검색 키로서 검색 속도를 향상시킨다.
( UNIQUE, PRIMARY KEY 생성시 자동적으로 생긴다.)
-- PRIMARY KEY 생성 예제. 제약조건명 EMP5_PK_EMPNO
CREATE TABLE EMP5(
empno NUMBER CONSTRAINT EMP5_PK_EMPNO PRIMARY KEY
);
-- 테이블 생성 후 ALTER 명령어로 PRIMARY KEY 생성 예제.
ALTER TABLE EMP5
ADD CONSTRAINT EMP5_PK_EMPNO PRIMARY KEY (empno);
외래키가 참조하는 기본키의 컬럼과 데이터 형이 일치해야 한다.
(이를 어기면 참조 무결성 제약에 의해 테이블을 생성할 수 없음 !)ON DELETE CASCADE
연산자와 함께 정의된 외래키의 데이터는 그 기본키가 삭제될 때 같이 삭제된다-- emp2 테이블의 deptno 컬럼이 dept 테이블의 deptno 컬럼을 참조하도록 외래키를 생성하자.
ALTER TABLE EMP2 ADD CONSTRAINT emp2_fk_deptno
FOREIGN KEY (deptno) REFERENCES TO DEPT(deptno);
/*
FOREIGN KEY 뒤의 (deptno)는 emp2 테이블의 deptno 컬럼
REFERENCES TO 뒤에는 참조할 테이블 명 (참조할 컬럼) 순서로 써준다.
*/
제약조건을 확인할 수 있는 테이블은 USER_CONS_COLUMNS
, USER_CONSTRAINTS
이다.
이 둘을 이용해서 해당 테이블의 제약조건을 알아내도록 해보자.
-- 테이블 이름을 입력했을 때, 해당 테이블의 컬럼명 / 제약조건 종류 / 제약조건 이름 을 출력.
SELECT A.COLUMN_NAME
, CASE WHEN B.CONSTRAINT_TYPE = 'C' THEN 'CHECK OR NOT NULL'
WHEN B.CONSTRAINT_TYPE = 'F' THEN 'FOREIGN KEY'
WHEN B.CONSTRAINT_TYPE = 'P' THEN 'PRIMARY KEY'
WHEN B.CONSTRAINT_TYPE = 'U' THEN 'UNIQUE KEY'
END AS CONSTRAINT_TYPE // DECODE 문을 써도 되지만 CASE 문도 사용 가능함. 마지막에 END AS 뒤에는 알리아스로 줄 이름 써주면 됨.
, A.CONSTRAINT_NAME
FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
WHERE A.TABLE_NAME = UPPER('&table_name')
// 치환변수 & 을 사용(실행 시 입력창 뜬다. 자바의 scanner 같은 것.)
// UPPER 는 대문자로 치환.
AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
AND A.TABLE_NAME = B.TABLE_NAME;
-- 테이블 명을 입력 하면 됩니다.
table_name의 값을 입력하십시오: emp
-- 결과
COLUMN_NAME CONSTRAINT_TYPE CONSTRAINT_NAME
----------- ---------------- ----------------
EMPNO CHECK OR NOT NULL SYS_C007071