: 테이블에 저장할 데이터를 제한하는 규칙
: 조건에 맞지 않는 데이터는 저장하지 않음. ==> DB의 정확성 유지 ( 무결성 = 신뢰성)
==> 대상
: 도메인 ( 컬럼 값들의 유효한 범위 ) , 엔티티(개체), 릴레이션(테이블)
ex)
create table table_notnull(
login_id varchar(20)not null,
login_pw varchar(20)not null,
tel varchar(20));
insert into table_notnull values ( 'TEST_ID_01',NULL,'010-1234-5678');
// login_pw 는 not null이어서 null 이 삽입안됨.
insert into table_notnull values ('TEST_ID_01',1234,NULL);
SELECT OWNER, constraint_name, constraint_type, table_name from USER_CONSTRAINTS;
- P = primary key
- R = reference 외래키
- C = check or not null
- U = unique
create table table_notnull2(
login_id varchar(20) CONSTRAINT tblnn2_lgid_nn not null ,
login_pw varchar(20) CONSTRAINT tblnn2_lgpw_nn not null,
tel varchar(20));
ALTER table table_notnull
MODIFY (tel not null); // 이미 NULL데이터 값이 있다면 modify로 수정 불가.
==> NULL값을 채워주거나 열 삭제후 수정해야함.
ALTER table table_notnull2
MODIFY(tel CONSTRAINT tbnn2_nn not null); //tel을 not null로 바꾸면서 tbnne_nn이라는 이름을붙여줌.
ALTER table table_notnull2
RENAME CONSTRAINT tbnn2_nn to tblnn2_tel;
ALTER table talbe_notnull2
DROP CONSTRAINT tblnn2_tel_nn;
: 열에 저장할 데이터의 중복을 허용하고 싶지 않을 때 사용.
: 여러개의 NULL이 존재할 수 있음.
ex)
create table table_unique(
login_id varchar(20) unique,
login_pw varchar(20)constraint tbu_logpw_nn not null,
tel varchar(20));
insert into table_unique values ('TEST_ID_01','PW01','010-1234-5678');
select* from table_unique;
insert into table_unique values ('TEST_ID_01','PW01','010-1234-5678'); //오류 : 'TEST_ID_01'은 중복 허용이 안됨.
insert into table_unique values ('TEST_ID_02','PW01','010-1234-5678'); // 다른 값들은UNIQUE 가 아니기 때문에 중복값 허용.
insert into table_unique values (NULL,'PW01','010-1234-5678'); //NOT NULL은 아니므로 NULL 가능.
: 값이 유일하게 하나만 있는 컬럼(UNIQUE + NOT NULL)
: 주민 번호,사번, 과목번호등의 컬럼을 식별할때 사용.
ex)
create table table_pk(
login_id varchar(20) PRIMARY KEY,
login_pw varchar(20)not null,
tel varchar(20));
select owner, constraint_name, constraint_type,
table_name from user_constraints
where table_name like 'TABLE_PK%'; // TABLE_PK 의 제약 조건만 조회
==> 자동으로 인덱스 생성.( PRIMARY KEY만 )
select index_name , table_owner, table_name from user_indexes
where table_name like 'TABLE_PK%';
create table table_pk2(
login_id varchar(20) constraint tblpk2_lgnid_pr primary key,
login_pw varchar(20)constraint tblpk2_lgipw_nn not null,
tel varchar(20));
==> (아웃오브라인방식) : 컬럼명을 정의해준 후 뒤에 옵션을 적어줌. NOT NULL은 지정할 수 없음.
create table table_pk2(
login_id varchar(20),
login_pw varchar(20),
tel varchar(20),
primary key (login_id), constraint tblpk2_uk unique(tel));
insert into table_pk2 values ( null, '1234','010-1234-5678'); -- PRIMARY KEY는 NULL값 입력 불가.
insert into table_pk2 values ( 'TEST_ID_01', '1234','010-1234-5678');
insert into table_pk2 values ( 'TEST_ID_01', '1234','010-1234-5678'); -- 무결성 위배 : ID 값 중복
: 다른 테이블과 관계를 지을때 사용.
: 즉정 테이블에서 PRIMARY KEY 조건을 지정한 열을 다른 테이블의 열에서 참조한다는 의미.(reference)
ex)
select owner, constraint_name, constraint_type, table_name,
R_owner, R_constraint_name from user_constraints //R_○○○ : 외래키 컬럼 조회
where table_name in('EMP','DEPT');
create table dept_pk(
deptno number(2) constraint deptpk_dno_pk primary key,
dname varchar2(14), loc varchar2(13));
insert into dept_pk values (10,'test_dname', 'test_loc'); //PRIMARY KEY는 NOTNULL
create table emp_fk (
empno number(4) constraint empfk_eno_pk primary key ,
ename varchar2(10), deptno number(2) constraint emfk_dno_fk REFERENCE dept_pk(deptno)); //데이터가 없는 테이블에서는 참조해올 수 없음.
insert into emp_fk values (9999,'test_name',10);
: 입력되는 데이터값이 세부적인 조건을 제한해주는 기능.
ex)
create table table_check(
login_id number(4) constraint emp_login_pk primary key,
login_pw varchar2(20) constraint emp_pw_ck CHECK(length(login_pw)>3 and length(login_pw)<15),
sal number(5) constraint emp_sal_ck CHECK( sal>0 and sal <8000),
gender char(1) constraint emp_en_ck CHECK( gender in('M','F')),
ename varchar2(10), tel varchar2(20));