* MySQL Client와 쓰레드
* auto commit = false
## autocommit
mysql은 autocommit의 기본 값이 true이다.
따라서 명령창에서 SQL을 실행하면 바로 실제 테이블에 적용된다.
수동으로 처리하고 싶다면 autocommit을 false로 설정하라!
> set autocommit=false;
* commit
insert/update/delete을 수행한 후 승인을 해야만 실제 테이블에 적용된다.
> commmit;
auto commit = false이기 때문에 변경을 해도
commit 하기 전까지는 적용이 되지 않는다.
따라서 다른 쉘을 실행해서 테이블을 확인해보면
반영되어있지 않는 것을 확인할 수 있다.
기존 쉘
다른 쉘
기존 쉘 커밋완료
다른 쉘 적용된 것 확인
* rollback
마지막 commit 상태로 되돌리고 싶다면,
> rollback;
auto commit = false 인 상황에서 테이블을 변경하고
rollback을 하게 된다면 변경한 값이 저장되기 않기 때문에
commit을 하여도 데이터가 변경되지 않는다.
* 데이터 조작 (DBMS에서 Data를 가공)
업무 UI등과 관련된 것이라면 DBMS에서 가공하는 것은 좋지않다.
DBMS에서 처리하는 양이 많아진다면 DBMS 전용 문법을 사용하게 되고
각 DBMS 마다 유지보수 해야 할 코드가 많아진다.
이에따라 Client 측 프로그램은 간단해지는 반면 Server에는 부하가 가중되기 쉽다.
* 데이터 조작 (App에서 Data를 가공)
App에서 Data를 가공하게 되면 Client 측에서 데이터를 가공하는 것이고
업무가 변경될 때 DBMS의 영향을 받지 않고 유지보수를 진행 할 수 있다.
DBMS 에서는 단순히 데이터를 찾아 반환받기 때문에
DBMS가 교체되더라도 SQL 코드가 많이 변경되지 않는다.
즉, DBMS 유지보수가 쉽다.
* 데이터 조작 (결론! 데이터 가공을 어디에서 ?)
DBMS는 주로 데이터의 저장, 검색, 갱신, 관리에 집중하고,
클라이언트 측은 사용자 인터페이스와 비즈니스 로직에 집중하는 것이 효율적이다.
* Foreign key
등장배경 ? 정보의 중복 저장 방지 !
작성자 정보가 중복해서 저장되면
① 메모리 낭비 문제와
② 작성자 정보 변경 시 결함 문제가 발생할 수 있다.
작성자 테이블 생성:
작성자 정보를 저장하기 위한 별도의 테이블을 생성
이 테이블은 작성자 번호와 작성자 이름, 작성자 메일, 작성자 사진 정보를 저장
다른 테이블에서 작성자 번호 사용:
다른 테이블에서 작성자 정보를 저장할 때,
작성자 번호를 참조하여 작성자 테이블과 연결.
예를 들어, "게시글" 테이블에서 작성자 정보를 저장하는 경우,
작성자 번호를 Foreign key로 사용하여 작성자 테이블과 관련시킨다.
작성자 정보 중복 제거:
작성자 정보 중복을 제거하고 작성자 테이블에서 각 작성자의 정보를 유일하게 관리
작성자 이름, 작성자 메일, 작성자 사진 정보는
작성자 번호를 통해 관련된 테이블에서 참조할 수 있음
* Foreign key 등장배경 (중복컬럼. 가변 개수의 데이터)
등장배경 ? 중복 컬럼을 해결하기위해 !
게시글마다 첨부 파일의 갯수가 달라서 컬럼 영역이 낭비된다 !
* Foreign key 등장배경 (중복컬럼. 가변 개수의 데이터)
① 게시글에 첨부하는 파일 개수만큼만 메모리 사용
② 첨부파일 갯수의 제한이 없다
## FK(foreign key) 제약 조건 설정
- 다른 테이블의 데이터와 연관된 데이터를 저장할 때 무효한 데이터가 입력되지 않도록 제어하는 문법이다.
- 다른 테이블의 데이터가 참조하는 데이터를 임의의 지우지 못하도록 제어하는 문법이다.
- 그래서 데이터의 무결성(data integrity; 결함이 없는 상태)을 유지하게 도와주는 문법이다.
다른 테이블의 PK를 참조하는 컬럼으로 선언한다.
alter table 테이블명
add constraint 제약조건이름 foreign key (컬럼명) references 테이블명(컬럼명);
alter table test2
add constraint test2_bno_fk foreign key (bno) references test1(no);
예시1 )
다른 테이블의 데이터와 연관된 데이터를 저장할 때 무효한 데이터가 입력되지 않도록 제어하는 문법이다.
test1에 있는 no5를 삭제하려고해도 삭제할 수 없다 !
왜냐하면 test2에 참조하고 있기 때문에 Forign key가 이를 방지한다.
예시2 )
다른 테이블의 데이터와 연관된 데이터를 저장할 때 무효한 데이터가 입력되지 않도록 제어하는 문법이다.
test2에 'x.gif'를 삽입하려고해도 할 수 없다 !
왜냐하면 test1에 참조되지 않은 값을 삽입하려하고 있기 때문에 Forign key가 이를 방지한다.