[SQL] UNIQUE

정은아·2022년 9월 13일
0

. UNIQUE 제약조건

  : 특정 컬럼에 대해 자료가 중복되지 않게 하는 것
    (지정된 컬럼에는 유일한 값만이 저장되게 하는 것이다.)

	UNIQUE는 해당 테이블에 있어서는 존재하는 값이 유일해야 한다.
	만일 INSERT 또는 UPDATE시, 제약이 걸려 있는 컬럼에
	동일한 데이터가 존재한다면 오류가 난다.
	이 때, NULL값에 대해서는 UNIQUE 제약이 적용되지 않는다.
	즉, NULL값은 데이터로 인식하지 않기 때문에
	해당 컬럼에 NULL 데이터행이 여러개 존재 가능하다.

. 테이블 생성시 UNIQUE 설정

CREATE TABLE TEST_TABLE(
 		COLUMN VARCHAR2(30) CONSTRANINT COLUMN1_UNQ UNIQUE(COLUMN1)
		);
		//COLUMN1_UNQ = 제약조건 이름
. 테이블 생성 후에 UNIQUE 설정

  . ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 UNIQUE(컬럼명);

  ex) ALTER TABLE TABLE_TEST ADD CONSTRAINT COLUMN1_UNQ UNIQUE(COLUMN1);

. PRIMARY KEY 제약조건

  . UNIQUE 제약조건 + NOT NULL 제약조건

  . 컬럼명과 자료형을 기술한 다음 PRIMARY KEY를 기술하면 된다.

  . PRIMARY KEY는 하나의 테이블에 있는 데이터들을
    식별하기 위한 기준으로 인식되는 제약 조건이다.
한개의 테이블에 하나만 생성이 가능하며,
PRIMARY KEY는 NOT NULL + UNIQUE의 속성을 가진다.
즉, NULL 값이 있으면 안되고 해당 컬럼의 데이터는 
중복되지 않고 유일해야 한다.
(foreign key는 여러개 존재가 가능하다.)
UNIQUE에서와 같이 여러 컬럼들을 조합해서 지정할 수 있다.

. 무결성

. 데이터베이스에 저장된 값들이 정확하고 일관성 있는
   데이터임을 나타내는 의미

 . 데이터베이스는 무결성이 보장되도록 여러 개체에
   규정을 부여하여 운영한다.

 . 즉, 필요없는 데이터는 걸러내고 필요한 데이터만 남아있는 상태를 말한다.

 . 무결성을 유지하는 것은 데이터베이스 관리시스템(DBMS)의
   중요한 기능이며, 주로 데이터에 적용되는 연산에
   제한을 두어 데이터의 무결성을 유지한다.

 . 무결성의 종류로는 개체무결성, 참조무결성, 도메인 무결성이 있다.
	
 도메인 무결성			check, not null, default

 객체 무결성			primary key, unique

 참조 무결성			foreign key

 . 도메인 무결성

   : 속성이 정의되어 있는 영역을 벗어나지 않도록 규정하는 것이다.

	  도메인 무결성에는 check, default, not null 제약이 있다.


1.
 create table test_44
 ( empno number(4),
   ename varchar2(30) not null,
	tel varchar2(30) default '010-777-7890',
	sal number(5) default 450,
	hiredate date default sysdate,
	gender char(1)
			constraint gender_check check(gender in('M', 'F')));

2.
select CONSTRAINT_NAME, CONSTRAINT_TYPE,
		         r_constraint_name,table_name
			 from USER_CONSTRAINTS;

3.
SQL> insert into test_44(empno,  ename, gender) values(3400, 'korea', 'K');
insert into test_44(empno,  ename, gender) values(3400, 'korea', 'K')
*
1행에 오류:
ORA-02290: 체크 제약조건(SCOTT.GENDER_CHECK)이 위배되었습니다.

SQL> insert into test_44(empno,  ename, gender) values(3400, 'korea', 'K');
insert into test_44(empno,  ename, gender) values(3400, 'korea', 'F')
== 제대로 된 행 만들어짐 
(Check에 제약조건을 줘서 'M' 또는 'F'만 넣었기 때문에 오류가 난 것이다.

1. 
 create table test_55
    ( empno number(4),
      ename varchar2(30) not null,
	   tel number(1)
	 			constraint tel_check check(tel > 3));
2.
 insert into test_55 values(345, 'seoul', 2);
 insert into test_55 values(345, 'seoul', 2)
*
1행에 오류:
ORA-02290: 체크 제약조건(SCOTT.TEL_CHECK)이 위배되었습니다
(tel>3 이기 떄문에)

3. 
SQL> insert into test_55 values(345, 'seoul', 7);

1 개의 행이 만들어졌습니다.
// tel(1) 이기 때문에 한 자릿수 숫자만 들어갈 수 있다, 
  10을 넘어서부터는 tel(2)로 수정하거나, 사용할 수 없다.


. 한 테이블의 제약 조건

 select table_name, CONSTRAINT_NAME, CONSTRAINT_TYPE,
 		 r_constraint_name
 FROM USER_CONSTRAINTS
 where table_name = 'TEST_55'; 
 ( WHERE 뒤에 오는 테이블명은 소문자로 써서는 안된다.)
profile
꾸준함의 가치를 믿는 개발자

0개의 댓글