Alter Tables (P11-2)
- 테이블의 구조를 변경할 때 사용
- 추가(ADD), 수정(MODIFY), 삭제(DROP)할 수 있음
- DB 운영중에 삭제를 하면 문제가 생길 수 있다. (시간 등) -> UNUSED 사용해서 없는 것처럼 해놓는다~
Add Columns (P11-4)
- 테이블에 데이터가 하나라도 있는 상태에서는 'NOT NULL' 제약조건을 사용할 수 없다.
- 기존 테이블에 있는 데이터(레코드)에도 새로운 칼럼이 추가되는데 이때 기존 레코드의 새로추가된 컬럼에는 초기값으로 null이 들어가므로 문제가 됨~(NOT NULL 제약조건을 쓴다면~)
Unused Columns (P11-7)
- Unused 시킨 컬럼은 다시 복구할 수 없다.(DROP 시킨거라고 생각하면 됨)
- Unused 컬럼 확인 방법
- SQL> DESC user_unused_col_tabs;
Name Null? Type
----------------------------------------- -------- ---------------------------- - TABLE_NAME NOT NULL VARCHAR2(30)
COUNT NUMBER
- Unused 컬럼의 데이터는 있어도 확인방법이 없고, 같은 이름의 컬럼은 새로 만들 수 있음.
- // loc 컬럼 unused 시킴
- SQL> ALTER TABLE dept
2 SET UNUSED(loc); - Table altered.
- // loc 컬럼 출력안됨.
- SQL> SELECT * FROM dept;
- DEPTNO DNAME COMMENTS
---------- -------------- ------------------------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
50 Local Branch - // unused된 loc컬럼명으로 add
- SQL> ALTER TABLE dept
2 ADD(loc varchar2(20)); - Table altered.
- // loc 컬럼 출력됨~
- SQL> SELECT * FROM dept;
- DEPTNO DNAME COMMENTS LOC
---------- -------------- ------------------------------ --------------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
50 Local Branch
Add Constraints (11-9)
- NOT NULL 조건은 제외~
- 기본키 제약조건이랑 유니크 제약조건은 자동으로 인덱스가 생성됨.
- SQL> ALTER TABLE emp
2 ADD CONSTRAINT emp_mgr_fk
3 FOREIGN KEY (mgr)
4 REFERENCES EMP(empno); - Table altered.
- SQL> SELECT CONSTRAINT_NAME
2 FROM user_constraints
3 WHERE table_name='EMP'; - CONSTRAINT_NAME
------------------------------
EMP_MGR_FK // 새로 추가한 제약조건
PK_EMP
FK_DEPTNO - SQL> SELECT CONSTRAINT_NAME, COLUMN_NAME
2 FROM user_cons_columns
3 WHERE TABLE_NAME = 'EMP'; - CONSTRAINT_NAME
------------------------------
COLUMN_NAME
-------------------------------------------------------------------------------- - FK_DEPTNO
DEPTNO - PK_EMP
EMPNO - EMP_MGR_FK
MGR
Drop Constraints (P11-10)
- PK-FK 제약조건이 걸린 것은 그냥 삭제가 안되고, CASCADE를 통해서 삭제해야 된다.
- 이때 삭제된 PK에 해당되는 FK도 같이 삭제됨
- // DEPT.DEPTNO는 그냥 삭제 안됨~
- SQL> ALTER TABLE dept
2 DROP PRIMARY KEY;
ALTER TABLE dept
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys - // FK_DEPTNO -> DEPT.DEPTNO의 기본키를 참조하고 있음(삭제안되는 이유)
- SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE
2 FROM user_constraints
3 WHERE TABLE_NAME = 'EMP'; - // P = 기본키 제약조건
- // R = 외래키 제약조건
- CONSTRAINT_NAME C
------------------------------ -
EMP_MGR_FK R
PK_EMP P
FK_DEPTNO R - // CASCADE를 이용해서 삭제함
- SQL> ALTER TABLE dept
2 DROP PRIMARY KEY CASCADE; - Table altered.
- // FK_DEPTNO까지 같이 삭제됨
- SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE
2 FROM user_constraints
3 WHERE TABLE_NAME = 'EMP'; - CONSTRAINT_NAME C
------------------------------ -
EMP_MGR_FK R
PK_EMP P
Enable Constraints (P11-11)
- 테이블 복사시 많이 사용
- 기존 데이터 -> 새로 복사시 : 제약조건 확인하면서 복사함
- 기존 데이터는 정상적으로 작동되던 것이기 때문에 제약조건에 문제없음
- 잠시 Disable 시켜놓고 복사하면 제약조건 확인을 안하기 때문에 속도가 빠름
- Enable : Disable 되있는 제약조건을 다시 활성화 시킴 (데이터 상태가 만족되어야 다시 enable 가능 -> PK쪽을 disable 시킨후 데이터 추가후 다시 enable 시키려고 했는데 PK 조건이 안맞으면 에러~)
P11-12 예제
- // alter2 테이블 별다른 제약조건 없이 생성
- SQL> CREATE TABLE alter2(a NUMBER, b CHAR, c DATE);
- Table created.
- // 데이터 2개 삽입 (a컬럼의 값이 중복되서 들어가는 것에 주의~)
- SQL> INSERT INTO alter2 VALUES(10, 'x', sysdate);
- 1 row created.
- SQL> INSERT INTO alter2 VALUES(10, 'y', sysdate);
- 1 row created.
- // a컬럼에 PK제약조건을 추가하려고 했는데 현재 테이블내 데이터 중 a값이 중복되서 오류~(10이 중복~)
- SQL> ALTER TABLE alter2 ADD CONSTRAINT alter2_a_pk PRIMARY KEY(a);
ALTER TABLE alter2 ADD CONSTRAINT alter2_a_pk PRIMARY KEY(a)
*
ERROR at line 1:
ORA-02437: cannot validate (SCOTT.ALTER2_A_PK) - primary key violated - // 중복된 것 확인~
- SQL> SELECT * FROM alter2 ORDER BY a;
- A B C
---------- - --------
10 x 08/11/04
10 y 08/11/04 - // 중복된 데이터 중 한개 제거
- SQL> DELETE FROM alter2 WHERE a=10 AND b='y';
- 1 row deleted.
- // 중복데이터 제거후 PK 제약조건 추가~
- SQL> ALTER TABLE alter2 ADD CONSTRAINT alter2_a_pk PRIMARY KEY (a);
- Table altered.
- // PK 제약조건이 걸려있으므로 중복데이터 추가 불가~
- SQL> INSERT INTO alter2 VALUES(10, 'y' , sysdate);
INSERT INTO alter2 VALUES(10, 'y' , sysdate)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.ALTER2_A_PK) violated - // PK 제약조건 비활성화(Disable)
SQL> ALTER TABLE alter2 DISABLE CONSTRAINT alter2_a_pk; - Table altered.
- // PK 제약조건이 비활성화 되있으므로 중복데이터 추가 가능~
- SQL> INSERT INTO alter2 VALUES(10, 'y', sysdate);
- 1 row created.
- SQL> /
- 1 row created.
- // 현제 테이블에 중복데이터가 있으므로 PK제약조건 활성화(Enable) 불가
- SQL> ALTER TABLE alter2 ENABLE CONSTRAINT alter2_a_pk;
ALTER TABLE alter2 ENABLE CONSTRAINT alter2_a_pk
*
ERROR at line 1:
ORA-02437: cannot validate (SCOTT.ALTER2_A_PK) - primary key violated - // 중복데이터 다시 제거~
SQL> DELETE FROM alter2 WHERE a=10 AND b='y'; - 2 rows deleted.
- // 중복데이터 제거후 제약조건 Enable 가능~
- SQL> ALTER TABLE alter2 ENABLE CONSTRAINT alter2_a_pk;
- Table altered.
Drop Table (P11-13)
- 다른 테이블과의 제약조건(PK-FK)이 있으면 삭제안됨 (다른 테이블에서 현재 삭제할 테이블의 컬럼을 참조하고 있는 경우)
- 'CASCADE CONSTRAINT' 사용해서 삭제해야함
- // test00계정
- SQL> DROP TABLE 교수;
drop table 교수
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
SQL> DROP TABLE 교수 CASCADE CONSTRAINTS;- Table dropped.
Rename (P11-15)
- 테이블명 변경
- SQL> RENAME emp to employees;
- Table renamed.
- SQL> SELECT * FROM EMP;
SELECT * FROM EMP
*
ERROR at line 1:
ORA-00942: table or view does not exist - // DDL 문이기 때문에 롤백이 안되므로 다시 바꾼것~
- SQL> RENAME employees to emp;
- Table renamed.
- 컬럼명 변경
- SQL> ALTER TABLE emp
2 RENAME COLUMN sal TO salary; - Table altered.
- SQL> SELECT * FROM salary;
SELECT * FROM salary
*
ERROR at line 1:
ORA-00942: table or view does not exist
Truncate (P11-17)
- DROP TABLE emp -> 데이터 모두 삭제, emp table 정의 삭제
- Delete from emp -> rollback 가능 -> rollback 정보 백업하느라 속도 느림
- Truncate table emp -> 자동커밍 -> rollback 가능 -> 속도빠름
- P11-18 예제
- SQL> SELECT count(*) FROM alter2;
- COUNT(*)
----------
1 - SQL> DELETE FROM alter2;
- 1 row deleted.
- SQL> SELECT count(*) FROM alter2;
- COUNT(*)
----------
0 - SQL> ROLLBACK;
- Rollback complete.
- SQL> SELECT count(*) FROM alter2;
- COUNT(*)
----------
1 - SQL>
SQL>
SQL> TRUNCATE TABLE alter2; - Table truncated.
- SQL> SELECT count(*) FROM alter2;
- COUNT(*)
----------
0 - SQL> ROLLBACK;
- Rollback complete.
- SQL> SELECT count(*) FROM alter2;
- COUNT(*)
----------
0
Comment (P11-19)
- Comment를 달면 딕셔너리에서 확인가능~
- SQL> comment on table emp is 'This table is for employee';
- Comment created.
- SQL> SELECT comments FROM user_tab_comments
2 WHERE table_name = 'EMP'; - COMMENTS
------------------------------------------- - This table is for employee
- FORMAT
- // JOB 컬럼을 30자로 출력~
- SQL> COL JOB FORMAT a30
SQL> select job from emp; - JOB
------------------------------
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK - JOB
------------------------------
CLERK
ANALYST
CLERK - 14 rows selected.
- // '0'갯수 기준으로 남은 공백을 0으로 채움
SQL> COL sal FORMAT 000000
SQL> SELECT sal FROM emp; - SAL
-------
005000
005000
005000
005000
005000
005000
005000
005000
005000
005000
005000 - SAL
-------
005000
005000
005000 - 14 rows selected.
- // '9' 갯수 기준으로 남은 것을 공백으로 채움
- SQL> COL sal FORMAT 999999
SQL> SELECT sal FROM emp; - SAL
-------
5000
5000
5000
5000
5000
5000
5000
5000
5000
5000
5000 - SAL
-------
5000
5000
5000 - 14 rows selected.
- // '$' 랑 ',' 형식 맞춰서~
- SQL> COL sal FORMAT $99,999,999
SQL> / - SAL
------------
$5,000
$5,000
$5,000
$5,000
$5,000
$5,000
$5,000
$5,000
$5,000
$5,000
$5,000 - SAL
------------
$5,000
$5,000
$5,000 - 14 rows selected.
이 글은 스프링노트에서 작성되었습니다.