Oracle Database 33. 제약조건
제약조건
- 테이블의 데이터를 저장 혹은 수정할 때 컬럼의 값에 대한 조건을 설정하는 것을 제약조건이라고 한다.
- 설정된 조건에 위배되는 값을 컬럼에 저장할 수 없으며 데이터의 무결성을 위한 구문이다.
- not null : 컬럼에 null을 허용하지 않는다.
- unique : 중복된 값을 허용하지 않는다.
null을 무한대로 저장할 수 있다. - primary key : 중복된 값을 허용하지 않으며 null값을 허용하지 않는다. 각 로우를 구분하기 위한 유일한 값을 저장하기 위해 사용한다.
- foreign key : 다른테이블 혹은 같은 테이블의 칼럼을 참조하는 제약조건이다. 참조하는 컬럼에 저장되어 있는 값만 컬럼에 저장할 수 있다. 일반적으로 primary ket 제약 조건이 설정된 컬럼을 참조한다.
- check : 조건에 만족할 경우 컬럼에 저장할 수 있도록 한다.
ex)
-- NOT NULL : 해당 컬럼에는 NULL을 저장할 수 없다.
create table test_table1(
data1 number,
data2 number not null
);
insert into test_table1(data1, data2)
values (100, 101);
insert into test_table1 (data1)
values (200);
-- data2가 null값이므로 값이 입력이 되지 않는다.
insert into test_table1(data2)
values (201);
-- data1은 not null 조건이 없으므로 입력이 된다.
-- not null 제약조건은 오류메세지가 정확하게 나오기 때문에 명확히 알 수 있다.
-- 그러나 다른 제약조건은 오류메세지가 랜덤하게 나오므로 오류메세지를 지정해 주어야한다.
ex)
-- nuique : 중복된 값을 허용하지 않고 null은 무한대로 허용한다.
create table test_table2(
data1 number,
data2 number constraint TEST_TABLE2_DATA2_UK unique
);
insert into test_table2(data1, data2)
values (100, 101);
insert into test_table2(data1, data2)
values (200,201);
insert into test_table2(data1, data2)
values (300, 201);
insert into test_table2(data1, data2)
values (200, null);
insert into test_table2(data1)
values (200);
ex)
-- primary key : 중복된 값을 허용하지 않으며 null값을 허용하지 않는다.
-- 각 로우를 구분하기 위한 유일한 값을 저장하기 위해 사용한다.
create table test_table3(
data1 number,
data2 number constraint TEST_TABLE3_DATA2_PK primary key
);
insert into test_table3 (data1, data2)
values (100,101);
insert into test_table3 (data1, data2)
values (100,101);
insert into test_table3 (data1)
values (100);
ex)
-- foreign key : 다른테이블 혹은 같은 테이블의 컬럼을 참조하는 제약 조건이다.
create table test_table4(
data1 number constraint TEST_TABLE4_PK primary key,
data2 number not null
);
insert into test_table4(data1, data2)
values (100,101);
insert into test_table4(data1, data2)
values (200,201);
create table test_table5(
data3 number not null,
data4 number constraint TEST_TABLE5_DATA4_PK
references test_table4(data1)
);
insert into test_table5 (data3, data4)
values (1,100);
insert into test_table5 (data3, data4)
values (2,100);
insert into test_table5 (data3, data4)
values (3,200);
insert into test_table5 (data3, data4)
values (4,200);
insert into test_table5 (data3, data4)
values (5,null);
insert into test_table5 (data3)
values (6);
insert into test_table4(data3, data4)
values (7, 300);
-- 부모키가 없으므로 에러다.
ex)
--check : 컬럼에 저장될 값을 지정한다.
create table test_table6(
data1 number constraint TEST_TABLE6_DATA_CK
check (data1 between 1 and 10),
data2 number constraint TEST_TABLE6_DATA2_CK
check (data2 in(10, 20, 30))
);
insert into test_table6 (data1, data2)
values (1,10);
insert into test_table6 (data1, data2)
values (2,20);
select * from test_table6;
insert into test_table6 (data1, data2)
values (20,10);
insert into test_table6 (data1,data2)
values (5,100);