본문 바로가기
IT/DataBase

SQL - 제약조건

by 천빈 2021. 5. 28.

제약조건 확인 : DESC USER_CONSTRAINTS;

  • CONSTRAINT_NAME : 제약조건 이름
  • CONSTRAINT_TYPE : 유형, P: Primary key), U(Unique), R(Reference), C(Check)
  • TABLE_NAME
  • SEARCH_CONDITION : CHECK 제약조건 내용
  • R_CONSTRAINT_NAME : 참조 테이블의 PK이름
  • DELETE_RULE : 참조 테이블의 PK컬럼이 삭제될 떄 사용되는 규칙,(NO ACTION, SET NULL, CASCADE등)

 

Q1 ) EMP 테이블의 테이블 이름, 제약조건, 타입을 확인해보자

SQL> SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'EMP';

TABLE_NAME      CONSTRAINT_NAME                                              CO
--------------- ------------------------------------------------------------ --
EMP             PK_EMP                                                       P
EMP             FK_DEPTNO                                                    R

 

 

삭제 RULE

  • ON DELETE CASCADE : 대상 데이터를 삭제하고, 해당 데이터를 참조하는 데이터도 삭제
  • ON DELETE SET NULL : 대상 데이터를 삭제하고, 해당 데이터를 참조하는 데이터는 NULL로 변환
  • ON DELETE RESTRICTED : 삭제 대상 데이터를 참조하는 데이터가 존재하면 삭제할 수 없다(DELETE 기본)

 

수정 RULE

  • ON UPDATE CASCADE : 해당 데이터를 수정하면, 해당 데이터를 참조하는 데이터도 수정

 

테이블 생성

CREATE TABLE 테이블이름 (

                    컬럼명1 데이터타입 [제약조건] ...);

 

테이블 수정

ALTER TABLE 테이블이름

ADD 칼럼명 데이터타입[제약조건]

ADD COSTRAINT 제약조건명 제약조건(컬럼명)

MODIFY 컬럼명 데이터타입

DROP COLUMN 컬럼명 [CASCADE CONSTRAINTS]

DROP PRIMARY KEY [CASCADE] | UNION(컬렴명...) [CASCADE] | CONSTRAINT 제약조건명[CASCADE]

 

이름변경

ALTER TABLE 기본 테이블명 RENAME TO 새 테이블 이름

RENAME 기존 테이블명 TO 새 테이블 명

 

ALTER TABLE 테이블명 RENAME COLUMN 기본칼럼명 TO 새칼럼명

ALTER TABLE 테이블명 RENAME CONSTRAINT 기존제약조건명 TO 새제약조건명

 

 

테이블 목사

서브쿼리를 이용한 테이블 생성 및 행 복사

서브쿼리를 이용해서 복사한 경우 NOT NULL을 제외한 제약 조건은 복사 안됨

(NOT NULL 제약 조건도 SYS_****로 복사된다.)

CREATE TABLE 테이블명[컬럼명] AS 서브쿼리

CREATE TABLE 테이블명 1 AS SELECT * FROM 테이블명 WHERE 1=0

 

 

 

Q2) 테이블 생성

SQL> CREATE TABLE TEST
  2  ( ID NUMBER(5), NAME CHAR(10), ADDRESS VARCHAR(50));

Table created.

SQL> DESC TEST;
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 ID                                                                                                                         NUMBER(5)
 NAME                                                                                                                       CHAR(10)
 ADDRESS

 

 

Q3) ID 칼럼을 USR 컬럼으로 변경하자

SQL> ALTER TABLE TEST
  2  RENAME COLUMN ID TO USR
  3  ;

 

 

Q4) 휴지통 비우기

SQL> DROP TABLE TEST01 PURGE;

Table dropped.

 

 

Q5) UNIQUE 테이블 생성/조건삭제

SQL> CREATE TABLE UTABLE(
  2  ID NUMBER CONSTRAINT U_ID_U UNIQUE,
  3  NAME VARCHAR2(10));

SQL> INSERT INTO UTABLE VALUES(NULL,'111');

1 row created.

SQL> INSERT INTO UTABLE VALUES(NULL,'111');

1 row created.

SQL> INSERT INTO UTABLE VALUES(NULL,'111');

1 row created.

SQL> ALTER TABLE UTABLE DROP CONSTRAINT U_ID_U;

Table altered.

# NULL값은 실제로 다 다른 값이므로 UNIQUE 조건에 위배되지 않음

 

 

Q6) 조건 다시 생성(그룹화) 후 다시 넣어보자

SQL> ALTER TABLE UTABLE ADD CONSTRAINT U_ID_U UNIQUE(ID,NAME);
SQL> INSERT INTO UTABLE VALUES(NULL,'111');

1 row created.

SQL> INSERT INTO UTABLE VALUES(NULL,'111');
INSERT INTO UTABLE VALUES(NULL,'111')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.U_ID_U) violated

SQL> INSERT INTO UTABLE VALUES(NULL,NULL);

1 row created.

SQL> INSERT INTO UTABLE VALUES(NULL,NULL);

1 row created.

# 묶여있는 경우에는(NULL,'111')의 경우 한 묶음으로 보기 떄문에 중복을 허용하지 않는다.

   즉(COLUMN,COLUMN)을 한 덩어리로 보기때문에 (NULL,NULL)은 계속 집어넣을 수 있다.

 

 

Q7) 기본키 칼럼 복수개 선언

'IT > DataBase' 카테고리의 다른 글

SQL - PL/SQL  (0) 2021.05.31
SQL - VIEW  (0) 2021.05.31
SQL - CRUD  (0) 2021.05.26
SQL - SUBQUERY  (0) 2021.05.25
SQL - SET  (0) 2021.05.25