--오토커밋 확인
SHOW AUTOCOMMIT;
--오토커밋 온
SET AUTOCOMMIT ON;
--오토커밋 오프
SET AUTOCOMMIT OFF;
SELECT * FROM emps;
INSERT INTO emps
(employee_id, last_name, email, hire_date, job_id)
VALUES(300,'kim', 'abc@naver.com',sysdate, 1800);
--보류 중인 모든 데이터 변경사항을 취소(폐기), 직전 커밋 단계로 회귀(돌아가기)
ROLLBACK;
COMMIT;
DELETE FROM emps
WHERE last_name = 'kim';
SAVEPOINT delete_kim;
--세이브포인트 생성
--롤백할 포인트를 직접 이름을 붙여서 지정할 수 있습니다. (표준 문법이 아니기 때문에 권장은 하지 않습니다.)
ROLLBACK TO SAVEPOINT delete_kim;
INSERT INTO emps
(employee_id, last_name, email, hire_date, job_id)
VALUES(301,'park', 'park@gmail.com',sysdate, 1800);
--보류 중인 모든 데이터 변경사항을 영구적으로 적용하면서 트랜잭션을 종료합니다.
COMMIT;
--NUMBER(2) -> 정수를 2자리까지 저장할 수 있는 숫자형 타입입니다.
--NUMBER(5,2) -> 정수부, 실수부를 합친 총 자리수 5자리, 소수점 2자리
--NUMBER -> 괄호를 생략할 시 (38,0)으로 자동 지정됩니다.
--VARCHAR2(byte) -> 괄호 안에 들어올 문자열의 최대 길이를 지정합니다.
CREATE TABLE dept2(
dept_no NUMBER(2),
dept_name VARCHAR2(14),
loca VARCHAR2(15),
dept_date DATE,
dept_bonus NUMBER(10)
);
DESC dept2;
SELECT * FROM dept2;
--NUMBER타입에 들어가는 자리수를 확인합니다
INSERT INTO dept3
VALUES (99, '영업', '서울', sysdate, '200000');
-- 컬럼 추가
ALTER TABLE dept2
ADD (dept_count NUMBER(3));
--열 이름 변경
ALTER TABLE dept2
RENAME COLUMN dept_count TO emp_count;
SELECT * FROM dept2;
-- 열 속성 수정
ALTER TABLE dept2
MODIFY (emp_count NUMBER(4));
DESC dept2;
--열 삭제
ALTER TABLE dept2
MODIFY (emp_count NUMBER(4));
DESC dept2;
--테이블 이름 수정
ALTER TABLE dept2
RENAME TO dept3;
--테이블 삭제(구조는 남겨두고 내부 데이터만 모두 삭제합니다.)
TRUNCATE TABLE dept3;
DROP TABLE dept3;
--테이블 생성과 제약 조건
--테이블 열레벨 제약조건(PRIMARY KEY, UNIQUE, NOT NULL, FOREIGN KEY)
--PRIMARY KEY: 테이블 고유 식별 컬럼입니다. (주요 키)
--UNIQUE: 유일한 값을 갖게 하는 컬럼입니다. (중복값을 방지합니다.)
--NOT NULL: null을 허용하지 않습니다.
--FOREIGN KEY: 참조하는 테이블의 PRIMARY KEY를 저장하는 컬럼입니다.
--CHECK: 정의된 형식만 저장되도록 허용합니다.
CREATE TABLE dept2(
dept_no NUMBER(2) CONSTRAINT dept2_deptno_pk PRIMARY KEY,
dept_name VARCHAR2(14) NOT NULL CONSTRAINT dept2_deptname_uk UNIQUE,
loca NUMBER(4) CONSTRAINT dept2_loca_locid_fk REFERENCES locations(location_id),
dept_bonus NUMBER(10),
dept_gender VARCHAR2(1) CONSTRAINT dept2_gender_ck CHECK(dept_gender IN('M','F'))
);
--테이블레벨 제약조건 (모든 열 선언 후 제약조건을 추가하는 방식)
CREATE TABLE dept2(
dept_no NUMBER(2),
dept_name VARCHAR2(14) NOT NULL,
loca NUMBER(4),
dept_date DATE,
dept_bonus NUMBER(10),
dept_gender VARCHAR2(1),
CONSTRAINT dept2_deptno_pk PRIMARY KEY (dept_no),
CONSTRAINT dept2_deptname_uk UNIQUE (dept_name),
CONSTRAINT dept2_loca_locid_fk FOREIGN KEY(loca) REFERENCES locations(location_id),
CONSTRAINT dept2_date
CONSTRAINT dept2_gender_ck CHECK(dept_gender IN('M','F'))
);
SELECT * FROM dept2;
INSERT INTO dept2
VALUES(10, 'gg', 4000, sysdate, 100000, 'M');
--외래키가 부모 테이블에 있다면 INSERT가 가능합니다.
INSERT INTO dept2
VALUES (30, 'aa', 1800, sysdate, 100000, 'X');
SELECT * FROM dept2;
SELECT * FROM locations
WHERE location_id = 1800;
--제약 조건 변경
-- 제약 조건은 추가, 삭제가 가능합니다. 변경은 안됩니다.
--변경하려면 삭제하고 새로운 내용으로 추가해야 합니다.
DROP TABLE dept2;
CREATE TABLE dept2 (
dept_no NUMBER(2),
dept_name VARCHAR2(14),
loca NUMBER(4),
dept_date DATE,
dept_bonus NUMBER(10),
dept_gender VARCHAR2(1)
);
--pk (기본키) 추가
ALTER TABLE dept2 ADD CONSTRAINT dept_no_pk PRIMARY KEY(dept_no);
--fk (외부키) 추가
ALTER TABLE dept2 ADD CONSTRAINT dept_loca_fk FOREIGN KEY (loca)
REFERENCES locations(location_id);
--check 추가
ALTER TABLE dept2 ADD CONSTRAINT dept2_gender_ck CHECK(dept_gender IN('M','F'));
--UNIQUE 추가
ALTER TABLE dept2 ADD CONSTRAINT dept2_deptname_uk UNIQUE (dept_name);
--NOT NULL은 열 수정 형태로 변경합니다.
ALTER TABLE dept2 MODIFY dept_name VARCHAR2(14) NOT NULL;
--제약조건 삭제(제약조건 이름으로)
ALTER TABLE dept2 DROP CONSTRAINT dept_no_pk;
--제약 조건 확인
SELECT * FROM user_constraints
WHERE table_name = 'DEPT2';