JUST DO, 데이터베이스! 🕺 - (6) COMMIT, ROLLBACK, PK

joyfulwave·2022년 9월 1일
0

방대한 데이터의 세계로, JUST DO DBMS!



📁 COMMIT 과 ROLLBACK

📎 COMMIT(커밋)

  • 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어에요.
  • COMMIT을 수행하면, 하나의 작업단위인 TRANSACTION(트렌젝션) 곧, INSERT, UPDATE, DELETE와 같은 작업 내용을 DB에 저장하게 돼요. 이전 데이터가 완전히 UPDATE되고 모든 사용자가 변경한 데이터의 결과를 볼 수 있어요.

📎 ROLLBACK(롤백)

  • 작업 중 문제가 발생했을 때, 트랜젝션의 처리 과정에서 발생한 변경 사항을 취소하고, 트랜젝션으로 인한 하나의 묶음 처리가 시작되기 이전의 상태로 되돌릴 수 있어요. COMMIT 한 곳 까지 TRANSACTION(INSERT, UPDATE, DELETE)작업 내용을 취소 및 복구할 수 있어요.
  • 트랜젝션 작업 중 하나라도 문제가 발생하면, 모든 작업을 취소해야 하기 때문에 하나의 논리적인 작업 단위로 구성해 놓아야해요. 만약 문제가 발생하면, 논리적인 작업의 단위를 모두 취소해 버리면 되기 때문이에요.

📎 COMMIT, ROLLBACK 명령어의 장점

  • 데이터 무결성이 보장돼요.
  • 논리적으로 연관된 작업을 그룹화 할 수 있어요.

📎 자동 COMMIT, 자동 ROLLBACK 되는 경우

⚫ 자동 ROLLBACK 되는 경우

  • 비정상적인 종료

⚫ 자동 COMMIT 되는 경우

  • DDL문(CREATE, ALTER, DROP, TRUNCATE)
  • DCL문(GRANT-권한 생성, REVOKE-권한 회수)사용권한
  • INSERT, UPDATE, DELETE 작업 후, COMMIT 하지 않고 오라클 정상 종료시에 COMMIT 명령어를 입력하지 않아도 자동으로 COMMIT 후 오라클이 종료돼요.

📎 AUTO COMMIT 해제

(1) AUTO COMMIT(자동 커밋)이 켜져 있는 상태에요.

(2) 'T'자 모양을 누르면 AUTO COMMIT이 해제돼요.

(3) AUTO COMMIT 해제 후 다시 COMMIT 명령을 실행해주기 전까지 작업 횟수가 쌓이게 돼요.

⚫ 예제

  -- 테이블 생성
   CREATE TABLE SAMPLE(
        deptNo		NUMBER(20),
        deptName	VARCHAR2(15),
        deptLoc		VARCHAR2(15),
        deptManager VARCHAR2(10)
   );
  
  COMMIT;
  
  -- 테이블 '영업부' 삭제  
  DELETE	SAMPLE
  WHERE		DEPTNAME = '영업부'
  ;

  SELECT 	*	FROM SAMPLE s ;
  DELETE 	SAMPLE WHERE DEPTNO = 20;

  -- 삭제하기 이전(COMMIT이 선언된 시점)으로 돌아간다.
  ROLLBACK;
  
  -- 현재 시점까지 DB에 저장한다.
  COMMIT



📁 데이터 제어어(Data Control Language)

  • 사용자에게 권한 생성 혹은 권한 삭제 같은 명령어
  • GRANT : 권한 생성
  • REVOKE : 권한 삭제



📁 컬럼속성(무결성 제약 조건)

  • NOT NULL : 널값이 입력되지 못하게 하는 조건
  • UNIQUE : 중복된 값이 입력되지 못하게 하는 조건(유일값)
  • CHECK : 주어진 값만 허용하는 조건
  • PRIMARY KEY(PK) : NOT NULL + UNIQUE 의미
  • FOREIGN KEY(FK) : 다른 테이블의 필드(컬럼)을 참조해서 무결성을 검사하는 조건
    -- NOT NULL
    CREATE 	TABLE null_test(
        col1	varchar2(20) NOT NULL,
        col2	varchar2(20) NULL,
        col3	varchar2(20)
    );

    INSERT 	INTO NULL_TEST (COL1, COL2)
    VALUES ('aa', 'bb')
    ;

    /*
     * COL1 이 NOT NULL 이기 때문에 오류가 발생
     */
    --INSERT 	INTO NULL_TEST (COL2, COL3)
    --VALUES ('aa', 'bb')
    --;

    INSERT 	INTO NULL_TEST (COL1, COL3)
    VALUES ('cc', 'dd')
    ;


    SELECT	*
    FROM 	NULL_TEST nt 
    ;

    -- UNIQUE
    CREATE 	TABLE UNIQUE_TEST(
        COL1 VARCHAR2(20) UNIQUE NOT NULL,
        COL2 VARCHAR2(20) UNIQUE,
        COL3 VARCHAR2(20) NOT NULL,
        COL4 VARCHAR2(20) NOT NULL,
        CONSTRAINTS TEMP_UNIQUE UNIQUE(COL3, COL4) --TEMP_UNIQUE : 제약조건의 이름
    );

    INSERT 	INTO UNIQUE_TEST  (COL1, COL2, COL3, COL4)
    VALUES ('aa', 'bb', 'cc', 'dd')
    ;

    INSERT 	INTO UNIQUE_TEST  (COL1, COL2, COL3, COL4)
    VALUES ('a2', 'b3', 'c4', 'd5')
    ;

    SELECT 	*
    FROM 	UNIQUE_TEST
    ;

    UPDATE 	UNIQUE_TEST 
    SET		COL1 = 'aa'
    WHERE 	COL2 = 'b2'
    ;

    INSERT 	INTO UNIQUE_TEST 
    VALUES ('a3', NULL, 'c3', 'c4')
    ;

    INSERT 	INTO UNIQUE_TEST 
    VALUES ('a4', NULL, 'c4', 'c3')
    ;

    CREATE 	TABLE UNIQUE_TEST2(
        COL1	VARCHAR2(20),
        COL2	VARCHAR2(20),
        CONSTRAINTS TEMP_UNIQUE2 UNIQUE(COL1, COL2) 
    );

    SELECT * FROM UNIQUE_TEST2 ut;

    INSERT INTO	UNIQUE_TEST2 
    VALUES ('aa', 'aa');

    INSERT INTO	UNIQUE_TEST2 
    VALUES ('aa', 'bb');

    INSERT INTO	UNIQUE_TEST2 
    VALUES ('aa', 'cc');

    SELECT * FROM UNIQUE_TEST2 ut;

    -- check
    CREATE 	TABLE CHECK_TEST(
        GENDER	VARCHAR2(10) NOT NULL,
        CONSTRAINTS CHECK_GENDER CHECK( GENDER IN('M', 'F') )
    );

    SELECT * FROM  CHECK_TEST;

    INSERT INTO	CHECK_TEST VALUES ('M');
    INSERT INTO	CHECK_TEST VALUES ('여성');
    -- 제약 조건에 벗어나는 데이터가 들어가면 오류가 발생된다.

📎 PRIMARY KEY(PK)

  • 기본키(PRIMARY KEY / PK / 주키 / 식별자) 역시 기본적인 제약 조건들은 테이블을 생성할 때 같이 정의돼요.
  • 테이블당 하나만 정의가 가능해요.
  • PK는 NOT NULL + UNIQUE의 기능을 가지고 있어요. (ex. 주민번호, 사번)
  • 자동 INDEX가 생성되는데 이는 검색키로서 검색 속도를 향상시켜요.
    -- 기본키 (PRIMARY KEY)
    CREATE 	TABLE PRIMARY_TEST( -- PK 제약조건을 거는 방법(1)
        STUDENT_ID	NUMBER(10) PRIMARY KEY,
        NAME		VARCHAR2(20)
    );

    SELECT * FROM PRIMARY_TEST ;
    -- ----------------------------------------------------------
    CREATE 	TABLE PRIMARY_TEST2( -- PK 제약조건을 거는 방법(2)
        STUDENT_ID	NUMBER(10),
        NAME		VARCHAR2(20),
        CONSTRAINTS STUDENT_PK PRIMARY KEY(STUDENT_ID)
    );

    SELECT * FROM PRIMARY_TEST2;
    -- ----------------------------------------------------------
    CREATE TABLE PRIMARY_TEST3(
        STUDENT_ID	NUMBER(10),
        NAME		VARCHAR2(20)
    );

    ALTER TABLE PRIMARY_TEST3  -- PK 제약조건을 거는 방법(3)
    ADD CONSTRAINTS STUDENT_PK3 PRIMARY KEY(STUDENT_ID)
    ;

    SELECT * FROM PRIMARY_TEST3 pt;



포기하지 말고 JUST DO! ✔️




출처
https://media.giphy.com/media/1hVi7JFFzplHW/giphy.gif
https://media.giphy.com/media/jUwpNzg9IcyrK/giphy.gif

0개의 댓글