DDL 문법에 대해 정리해보자.
특정 테이블의 제약 조건 목록을 확인하기 위해서는 아래와 같은 SQL 명령을 사용한다.
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP';
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
EMP PK_EMP
EMP FK_DEPTNO
테이블을 생성할 때 아래와 같이 SELECT를 사용해 다른 테이블의 내용을 가져와 생성할 수 있다. 해당 테이블의 틀만 가져오고 싶을 때는 WHERE 절의 조건을 거짓으로 처리하면 된다.
SQL> CREATE TABLE DEPT03 AS SELECT *
FROM DEPT
WHERE 1=0;
테이블이 생성되었습니다.
컬럼 추가 및 컬럼 속성 변경
SQL> alter table EMP03 ADD (JOB VARCHAR2(20) );
테이블이 변경되었습니다.
SQL> DESC EMP03
이름 널? 유형
----------------------------------------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(20)
SQL> alter table emp03 modify ( job varchar2(30) );
테이블이 변경되었습니다.
SQL> desc emp03
이름 널? 유형
----------------------------------------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(30)
컬럼 제거하기
SQL> desc emp03
이름 널? 유형
----------------------------------------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(30)
SQL> alter table emp03 drop column job;
테이블이 변경되었습니다.
SQL> desc emp03
이름 널? 유형
----------------------------------------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
테이블 삭제
SQL> truncate table emp02;
테이블이 잘렸습니다.
SQL> select * from emp02;
선택된 레코드가 없습니다.
기본값 설정
SQL> alter table 학생 add GRADE CHAR(2) DEFAULT 'F';
테이블이 변경되었습니다.
SQL> SELECT * FROM 학생;
학번 이름 학년 학과 나 GR
---------- ---------- ---------- --------------- -- --
100 나수영 4 컴퓨터 F
200 이찬수 3 컴퓨터 F
300 정기태 1 컴퓨터 F
400 송병길 4 경영 F
500 박종화 2 컴퓨터 F
600 안재하 1 전자공학 F
6 개의 행이 선택되었습니다.
SQL> ALTER TABLE 학생 ADD CONSTRAINT 학생_PK PRIMARY KEY(학번);
테이블이 변경되었습니다.
SQL> ALTER TABLE 과목 ADD CONSTRAINT 과목_PK PRIMARY KEY(과목번호);
테이블이 변경되었습니다.
SQL> ALTER TABLE 등록 ADD CONSTRAINT 등록_PK PRIMARY KEY(학번,과목번호);
테이블이 변경되었습니다.
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='학생';
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
학생 SYS_C009399
학생 학생_PK
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='과목';
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
과목 SYS_C009400
과목 SYS_C009401
과목 과목_PK
SQL> ALTER TABLE 등록 ADD CONSTRAINT 등록_FK1 FOREIGN KEY(학번) REFERENCES 학생;
테이블이 변경되었습니다.
SQL> ALTER TABLE 등록 ADD CONSTRAINT 등록_FK2 FOREIGN KEY(과목번호) REFERENCES 과목;
테이블이 변경되었습니다.
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('등록', '학생', '과목');
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
과목 과목_PK
등록 등록_PK
등록 등록_FK1
등록 등록_FK2
학생 학생_PK
SQL> ALTER TABLE 학생 ADD CONSTRAINT 나이_CH CHECK ( 나이 >= 18 );
테이블이 변경되었습니다.
SQL> ALTER TABLE 과목 ADD CONSTRAINT 학점_CH CHECK ( 학점 IN (1,2,3) );
테이블이 변경되었습니다.
SQL> ALTER TABLE 등록 ADD CONSTRAINT 성적_CH CHECK ( 성적 IN ('A', 'B', 'C', 'D', 'F') );
테이블이 변경되었습니다.
SQL> UPDATE 등록 SET 성적='E' WHERE 학번=100;
UPDATE 등록 SET 성적='E' WHERE 학번=100
*
1행에 오류:
ORA-02290: 체크 제약조건(SCOTT.성적_CH)이 위배되었습니다