_, $, #
만 가능CREATE TABLE copy_dept
(deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13),
create_date DATE DEFAULT SYSDATE);
DESCRIBE copy_dept
데이터 유형 | 설명 |
---|---|
VARCHAR2(size) | 가변 길이 문자 |
CHAR(size) | 내용 6 |
NUMBER(p,s) 전체자리수, 소수점자리수 | 가변 길이 숫자 |
DATE | 날짜 및 시간 값 |
LONG | 가변 길이 문자(최대 2GB) |
CLOB | 최대 크기는 (4GB - 1) * (DB_BLOCK_SIZE) |
RAW 및 LONG RAW | Raw binary data |
BLOB | 최대 크기는 (4GB - 1) * (DB_BLOCK_SIZE 초기화 파라미터(8TB - 128TB)) |
BFILE | 외부 파일에 저장된 바이너리 데이터(최대 4GB) |
ROWID | 행의 주소값. 테이블에 있는 행의 고유한 주소를 나타내는 base-64 숫자 체계 |
VARCHAR2(), CHAR()
LONG, CLOB
ex) 예를 들어, A라는 문자를 저장하면
VARCHAR2(5)
--> A
CHAR(5)
--> A____
(5byte 길이만큼을 유지하자는 의미라서, 빈 공백문자를 4개 붙여서 5개의 길이가 같이 저장되도록 함)
🔸여기서 size는 최댓값이라 더 작은 길이의 문자 저장 가능
NUMBER(7,2)
--> 전체 7자리 중 소수점이 2자리 (정수부에 5자리 사용가능)
--> 저장할 수 있는 최댓값: 99999.99
RAW나 LONG RAW 보다 현재는 BLOB나 BFILE을 권장
데이터 유형 | 설명 |
---|---|
TIMESTAMP | 소수 표시 초 단위의 날짜 |
INTERVAL YEAR TO MONTH | 년, 월 간격으로 저장됨 |
INTERVAL DAY TO SECOND | 일, 시, 분, 초 간격으로 저장됨 |
기본값 지정
create table hire_dates
(id number(8),
hire_date date default sysdate);
CREATE TABLE copy_dept
(deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13),
create_date DATE DEFAULT SYSDATE);
DESC copy_dept
INSERT INTO copy_dept (deptno, dname, loc)
VALUES (10, 'ACCOUNTING', 'NEW YORK') ;
INSERT INTO copy_dept
VALUES (20, 'RESEARCH', 'DALLAS', DEFAULT) ;
INSERT INTO copy_dept
VALUES (30, 'SALES', 'CHICAGO', NULL);
SELECT * FROM copy_dept ;
COMMIT ;
INSERT INTO copy_dept (deptno, dname, loc) VALUES (10, 'ACCOUNTING', 'NEW YORK') ;
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
CREATE TABLE copy_emp
(empno NUMBER(4) CONSTRAINT cpemp_pk PRIMARY KEY,
ename VARCHAR2(10) CONSTRAINT cpemp_nn NOT NULL,
email VARCHAR2(20) CONSTRAINT cpemp_uk UNIQUE,
sal NUMBER(7,2) CONSTRAINT cpemp_ck CHECK(sal > 0),
deptno NUMBER(2) CONSTRAINT cpemp_fk REFERENCES copy_dept(deptno)) ;
-- 오류발생
UPDATE copy_emp
SET ename = NULL
WHERE empno = 7788 ;
-- null값 가능
UPDATE copy_emp
SET email = NULL
WHERE empno = 7788 ;
-- 오류발생: 무결성 제약조건 위배(중복 허용 x)
UPDATE copy_emp
SET email = 'jones'
WHERE empno = 7788 ;
-- 현재 empno가 primary key임(위쪽 create문 참고)
-- 오류발생: 중복 허용 X
-- empno가 7566인 값을 7788로 바꿔라 -> 중복됨
UPDATE copy_emp
SET empno = 7788
WHERE empno = 7566 ;
-- 오류발생: null값 허용 X
UPDATE copy_emp
SET empno = NULL
WHERE empno = 7566 ;
-- 오류발생: copy_dept에는 deptno가 55번인 값이 없음
-- -> 참조할 부모 키가 없으므로 오류
UPDATE copy_emp
SET deptno = 55
WHERE empno = 7566 ;
-- 오류발생: copy_dept가 참조하고 있는 copy_emp에 deptno가 10인 값이 있기 때문에
-- delete 되어버리면 copy_dept는 없는 키값을 참조하는 상황이 되어버림
-- 무결정 제약조건 위배: 자식 레코드 발견
delete copy_dept
where deptno = 10;
📌 foreign key 제약으로 참조 중인 테이블이 있다면,
delete 명령 사용 불가능
FOREIGN KEY
: 테이블 제약조건 레벨에서 하위 테이블의 열을 정의REFERENCES
: 테이블 및 상위 테이블의 열을 식별ON DELETE CASCADE
: 상위 테이블의 행이 삭제될 때 하위 테이블의 종속 행을 삭제함ON DELETE SET NULL
: 종속 Foreign key 값을 null로 변환함
ALTER TABLE copy_emp
ADD CONSTRAINT cpemp_fk FOREIGN KEY(deptno)
REFERENCES copy_dept(deptno) ON DELETE SET NULL ;
SELECT * FROM copy_emp ;
-- delete 되고 그 부분은 null로 업데이트 됨
DELETE copy_dept
WHERE deptno = 10 ;
SELECT * FROM copy_emp ;
REFERENCES copy_dept(deptno) ON DELETE SET NULL;
: copy_dept테이블의 deptno를 참조하는데
deptno가 delete 되는 상황이 생기면, 그 값을 null로 업데이트 해놓겠다는 의미
ALTER TABLE copy_emp
ADD CONSTRAINT cpemp_fk FOREIGN KEY(deptno)
REFERENCES copy_dept(deptno) ON DELETE CASCADE ;
..., salary NUMBER(2)
CONSTRAINT emp_salary_min
CHECK (salary > 0), ...
-- 오류발생: salary*12의 별칭을 지어줘야함(특수문자 *은 출력 불가능)
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12
FROM employees
WHERE department_id = 80;
-- alias로 오류해결
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12 as ANNSAL
FROM employees
WHERE department_id = 80;
- 새 열 추가
- 기존 열 정의 수정
- 새 열에 기본값 정의
- 열 삭제
- 열 이름 바꾸기
- 읽기 전용 상태로 테이블 변경
ALTER TABLE copy_emp
ADD (hiredate DATE) ;
ALTER TABLE copy_emp
MODIFY (hiredate NUMBER(4));
ALTER TABLE copy_emp
MODIFY (hiredate DATE DEFAULT SYSDATE);
ALTER TABLE copy_emp
DROP (hiredate) ;
좀 더 빠르게 특정 컬럼을 사용하지 않는 상태로 표시해줌
SET UNUSED
: 하나 이상의 열을 unused로 표시DROP UNUSED COLUMNS
: unused로 표시된 열 제거ALTER TABLE copy_emp
SET UNUSED (email) ;
SELECT *
FROM user_unused_col_tabs ;
ALTER TABLE copy_emp
DROP UNUSED COLUMNS ;
drop하면 삭제는 되지만 공간은 그대로 남아있기 때문에
DROP UNUSED COLUMNS
를 통해 공간까지 완전히 제거
READ ONLY
READ WRITE
ALTER TABLE employees READ ONLY;
ALTER TABLE employees READ WRITE;
Recycle bin(휴지통)
으로 이동PURGE 절
이 지정되면 테이블 및 해당 데이터를 완전히 제거-- 테이블 삭제(휴지통에는 아직 있음)
DROP TABLE copy_emp ;
-- 검색해도 안나옴
SELECT * FROM copy_emp;
-- 휴지통 검색 시 copy_emp 검색됨
SHOW RECYCLEBIN
-- 휴지통에 있는 copy_emp를 다시 가져옴
FLASHBACK TABLE copy_emp TO BEFORE DROP ;
-- copy_emp 테이블이 검색됨
SELECT * FROM copy_emp;
-- 완전 제거됨
DROP TABLE copy_emp PURGE ;