제약조건

  • 테이블의 데이터를 저장 혹은 수정할 때 컬럼의 값에 대한 조건을 설정하는 것을 제약조건이라고 한다.
  • 설정된 조건에 위배되는 값을 컬럼에 저장할 수 없으며 데이터의 무결성을 위한 구문이다.
  • 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);