이번에는 트랜잭션에 대해 알아볼게요.
처음에 트랜잭션이라는 단어를 보고 이게 대체... 뭔가 작업을 처리하는 단위가 뭔데요... 했거든요.
결국은 풀어서 말하자면, 데이터베이스의 상태를 변화시키는 어떤 논리적 기능을 수행하는 작업 단위, 한번에 수행되어야 하는 연산들을 말하더라고요!
1. 트랜잭션 특성
1) 원자성: All or Nothing
2) 일관성: 트랜잭션 하나 실행했는데 데이터모델 자체가 바뀌거나 하는 일이 없어야 한다는 말
3) 고립성: 누군가가 어떤 모듈에 접근을 하는데 함께 작업하면 안 된다는 말, 한 사람이 작업을 하고 있기 때문에 다른 사람은 그게 끝나고서야 들어갈 수 있다는 것
4) 영속성(=지속성): 한 번 데이터 실행하고 나면 다른 사용자가 바꾸기 전까진 영구적으로 보장되어야 한다는 말
2. SQL문의 실행 순서
1) SQL문의 문법 검사
2) 구문분석(Parsing): 구문분석한 것은 Library Cache에 저장
3) SQL 실행(Execution): Optimizer가 수립한 실행 계획에 따라 실행
4) 데이터 추출(Fetch): 데이터를 읽고 전송
*Optimizer는 어떻게 최적화된 경로로 실행할 것인지를 결정하는 DB engine
3. 제약 조건
create table EMP(
ename varchar2(20),
sal number(10,2) default 0,
deptno varchar2(4) not null,
createdate date default sysdate,
constraint emppk primary key (empno)
);
default는 데이터를 입력하지 않았을 때의 기본값을 지정하는 것으로 sal number(10,2) default 0에서는 데이터를 입력하지 않으면 0값을 출력하도록 제약 조건을 건 거예요!
마찬가지로 createdate date default sysdate에서는 sysdate 즉, 현재 날짜,시간,분,초를 출력해요!
not null은 데이터를 입력하지 않을 수 없다는 제약조건이에요.
constraint를 사용하면 위처럼 기본키와 기본키의 이름을 지정할 수 있어요. 예에서는 하나의 기본키만 지정했지만, 2개 이상의 기본키를 설정하고 싶다면 ( ) 안에 지정하고자하는 칼럼의 이름은 ,(콤마)와 함께 넣으면 돼요.
외에도 외래키 설정을 할 수도 있어요. 이때는 부모테이블이 존재해야만 자식테이블에 부모테이블을 참조한다는 references와 함께 사용해요.
ex) constraint deptfk foreign key (deptno) references dept (deptno); 와 같은 형식!!
4. cascade
참조관계(기본키, 외래키 관계)가 있으면 참조되는 데이터를 자동 반영할 수 있게 해주는 것인데,
쉽게 말해서 부모테이블과 자식테이블을 생성하고 참조관계를 설정한 후에 cascade를 사용하면 부모테이블에서 변경사항이 발생하면 자식테이블도 자동으로 함께 변경되도록 하는 거예요!
*on delete cascade를 사용하면 참조 무결성을 준수할 수 있어요. 부모테이블에 없는데 자식테이블에 있는 경우가 없다는 거죠! 자동 삭제되니까~
5. 실습해봅시다!
--부모테이블 만들기!
create table DEPT(
deptno varchar2(4) primary key,
deptname varchar2(20)
);
insert into dept values('1000', '인사팀');
insert into dept values('1001', '총무팀');
--자식테이블 만들기!
create table EMP(
empno number(10),
ename varchar2(20) not null,
sal number(10,2) default 0,
deptno varchar2(4) not null,
createdate date default sysdate,
constraint emppk primary key (empno), --EMP테이블의 empno 컬럼을 emppk라는 이름의 기본키로 설정!
constraint deptfk foreign key (deptno) references dept (deptno) on delete cascade
--deptfk라는 이름으로 dept테이블의 deptno을 외래키로 설정!
);
insert into emp values(100, '토마토', 1000, '1000', sysdate);
insert into emp values(101, '블로깅', 2000, '1001', sysdate);
--이때 부모테이블에 없는 건 안 들어가요! (무결성 제약조건 위반이기 때문!)
--테이블을 삭제할 때에는 자식테이블을 삭제한 후에 부모테이블을 삭제해야 해요! 묶여있는 친구가 있는데 상위의 것을 먼저 삭제하면 에러가 뜨거든요~ 이게 번거롭기 때문에 cascade를 사용하는 겁니다! 자동으로 처리해달라고!
6. 테이블명 변경 & 칼럼 추가 & 테이블 변경
alter table ~ rename to는 이미 입력한 테이블의 이름을 변경하고 싶을 때 사용하는 구문이에요!
여기서 조금 변형한 alter table ~ add를 사용하면 칼럼을 추가할 수 있어요!
alter table ~ modify문을 사용하면 칼럼도 변경할 수 있어요. 이때 제약조건을 설정할 수도 있답니다. 칼럼 데이터 타입을 변경할 때는 기존 데이터가 있는 경우에는 에러가 발생할 수 있어요. 이미 숫자형이 들어가있는데 문자형으로 바꾸거나 하면 당연히 에러가 발생할 수 밖에 없겠죠.
alter table ~ drop column문은 칼럼을 삭제하는 구문이에요.
alter table ~ rename column to문은 칼럼 이름을 변경할 수 있도록 해줘요.
+ drop table에서 cascade constraint을 사용하면 테이블의 데이터 외래키로 참조한 자식 테이블과 관련한 제약조건까지 모두 같이 삭제돼요.
7. 실습해봅시다! 2
--테이블명 수정
alter table emp
rename to new_emp;
alter table new_emp
rename to emp;
--테이블에 칼럼 추가
alter table emp
add (age number(2) default 1);
--칼럼 변경
alter table emp
modify (ename varchar2(50));
--칼럼 삭제
alter table emp
drop column age;
--칼럼명 변경
alter table emp
rename column ename to new_ename;
--테이블 제약조건 삭제
drop table emp cascade constraint;
'SQL' 카테고리의 다른 글
SQLD 10 (1) | 2023.09.09 |
---|---|
SQLD 9 (0) | 2023.09.09 |
SQLD 7 (0) | 2023.09.07 |
SQLD 6 (0) | 2023.09.07 |
SQLD 5 (0) | 2023.09.07 |