8. Commit, Transaction, Delete, Update, CONSTRAINT

Commit

일련의 과정을 거친 후 커밋을 해줘야 데이터베이스에 반영이 된다.
오라클의 경우 DDL은 자동으로 커밋이 되며 DML은 직접 커밋을 해줘야 한다.
커밋의 과정중 에러가 나면 롤백시킨다.

Transaction

여러개의 job를 묶어 놓은것을 Transaction이라 한다.

DELETE

DELETE
FROM BOOK
WHERE NO = 1;

COMMIT; // 커밋한다.
ROLLBACK; //다시 롤백한다.

UPDATE

UPDATE BOOK
SET TITLE = ‘토지2’
WHERE NO = 1;

Subquery를 이용한 테이블 생성

백업용 테스트용으로 많이 쓰인다.

Subquery의 결과와 동일한 테이블 생성됨
질의 결과 레코드들이 포함됨
NOT NULL 제약 조건 만 상속됨

CREATE TABLE EMPLOYEES_BAK01
AS ( SELECT *
FROM EMPLOYEES
WHERE JOB_ID = ‘FI_ACCOUNT’
);

char, varchar

char - 10바이트를 만들고 ‘ab’를 입력하면 10바이트 할당됨
varchar - 10바이트를 만들고 ‘ab’를 입력하면 2바이트 할당됨

모든 데이터가 고정크기일 때 (ex 주민번호, 학번) - char
모든 데이터가 고정크기가 아닐 때 (ex 이메일) - varchar

varchar, varchar2

기능상의 다른점은 없지만 varchar2에서 성능개선이 이뤄짐.
varchar는 곧 없어질 것이라 예고를 하고있다.

NUMBER(x,y)

y는 실수부분을 의미한다.

varchar2(5), nvarchar2(5)

varchar2(5)는 5바이트를 할당
nvarchar2(5) 는 5글자를 할당
한글은 UTF-8을 사용하기 떄문에 문제가 된다.

–NVARCHAR2 , VARCHAR2와 비교

CREATE TABLE BOOK(
NO NUMBER(10),
TITLE VARCHAR2(120),
AUTHOR VARCHAR2(5), –MAX 4000 BYTE
TEST NVARCHAR2(2000), –MAX 2000자( 내부적으로 6000 BYTE )
PUB_DTAE DATE
);

INSERT INTO BOOK VALUES(1, ‘토지’, ‘가나’, SYSDATE);
– 가나가 6바이트라 에러가 발생..

INSERT INTO BOOK VALUES(1, ‘토지’, ‘가’, SYSDATE);
– 정상적으로 INSERT 가능

ALTER

ALTER TABLE BOOK ADD(PUBS VARCHAR(120));
–컬럼추가
ALTER TABLE BOOK MODIFY(PUBS VARCHAR(200));
–컬럼 변경
ALTER TABLE BOOK RENAME COLUMN PUBS TO PUBLISHINGS;
–컬럼명 변경
ALTER TABLE BOOK DROP(PUBLISHINGS);
–컬럼 제거
ALTER TABLE BOOK MODIFY(AUTHOR VARCHAR(300) NOT NULL);
–컬럼 변경
ALTER TABLE BOOK SET UNUSED(AUTHOR);
–컬럼을 보이지 않게 만듦
ALTER TABLE BOOK DROP UNUSED COLUMNS;
–보이지 않게 만든 컬럼을 삭제함

SEQUENCE

값이 1씩 증가한다
CREATE TABLE BOOK(
NO NUMBER(10),
TITLE VARCHAR2(200) NOT NULL,
AUTHOR VARCHAR2(50) NOT NULL, –MAX 4000 BYTE
PUB_DATE DATE,

PRIMARY KEY(NO)

);

CREATE SEQUENCE SEQ_BOOK
START WITH 1 –1부터 시작
INCREMENT BY 1 –1씩 증가
MAXVALUE 999999999 –MAX가 다차면 1로 돌아감
–PRIMARY KEY 자동증가

SELECT SEQ_BOOK.NEXTVAL FROM DUAL; –증가
SELECT SEQ_BOOK.CURRVAL FROM DUAL; –최근값

INSERT INTO BOOK VALUES(
SEQ_BOOK.NEXTVAL,
‘토지2’,
‘박경리’,
SYSDATE
);
–INSERT 문에서의 시퀀스 활용

CHECK

CREATE TABLE BOOK(
NO NUMBER(10),
TITLE VARCHAR2(200) NOT NULL,
AUTHOR VARCHAR2(50) NOT NULL, –MAX 4000 BYTE
PUB_DATE DATE,
STATE VARCHAR2(12) NOT NULL,
PRIMARY KEY(NO),
CONSTRAINT C_BOOK_CHECK CHECK(STATE IN (‘대여중’, ‘대여가능’))
);

INSERT INTO BOOK VALUES(
SEQ_BOOK.NEXTVAL,
‘토지2’,
‘박경리’,
SYSDATE,
‘대여가능’ –대여중, 대여가능만 들어갈 수 있다.
);

외부키

CREATE SEQUENCE SEQ_AUTHOR
START WITH 1
INCREMENT BY 1
MAXVALUE 999999999
–시퀀스 생성

CREATE TABLE AUTHOR(
NO NUMBER(10),
NAME VARCHAR2(200) NOT NULL,
PROFILE VARCHAR2(2000),
PRIMARY KEY(NO)
)

CREATE TABLE BOOK(
NO NUMBER(10),
TITLE VARCHAR2(200) NOT NULL,
AUTHOR_NO NUMBER(10) , –MAX 4000 BYTE
STATE VARCHAR2(12) NOT NULL,
PUB_DATE DATE,
PRIMARY KEY(NO),
CONSTRAINT C_BOOK_FK FOREIGN KEY (AUTHOR_NO) REFERENCES AUTHOR(NO)
ON DELETE CASCADE , –AUTHOR 테이블의 박경리 데이터가 삭제도면 BOOK테이블의 토지 데이터도 삭제된다.
ON DELETE SET NULL, –AUTHOR 테이블의 박경리 데이터가 삭제도면 BOOK테이블의 AUTHOR_NO는 NULL이 된다..
CONSTRAINT C_BOOK_CHECK CHECK(STATE IN (‘대여중’, ‘대여가능’))
);

INSERT INTO AUTHOR VALUES(
SEQ_AUTHOR.NEXTVAL,
‘박경리’,
NULL);

INSERT INTO BOOK VALUES(
SEQ_BOOK.NEXTVAL,
‘토지’,
1,
‘대여가능’,
SYSDATE);

CONSTRAINT

제약조건은 보통 ALTER테이블을 통해 모아서 준다.
아래와 같이..
CREATE TABLE AUTHOR(
NO NUMBER(10),
NAME VARCHAR2(200) NOT NULL,
PROFILE VARCHAR2(2000)
)

ALTER TABLE AUTHOR
ADD CONSTRAINT C_AUTHOR_PK
PRIMARY KEY(NO);

CREATE TABLE BOOK(
NO NUMBER(10),
TITLE VARCHAR2(200) NOT NULL,
AUTHOR_NO NUMBER(10) NOT NULL, –MAX 4000 BYTE
STATE VARCHAR2(12) NOT NULL,
PUB_DATE DATE
);

ALTER TABLE BOOK
ADD CONSTRAINT C_BOOK_PK
PRIMARY KEY(NO);

ALTER TABLE BOOK
ADD CONSTRAINT C_BOOK_CHECK
CHECK(STATE IN (‘대여중’, ‘대여가능’));

ALTER TABLE BOOK
ADD CONSTRAINT C_BOOK_FK
FOREIGN KEY (AUTHOR_NO) REFERENCES AUTHOR(NO) ON DELETE CASCADE ;

Share