DATABASE 6일차 (insert)
트랜잭션
논리적 작업 단위를 하나의 모음으로 구성 한 것
DML : 조작 언어 : 트랜잭션의 시작 종료 안에 값이 들어가 있다.
ex) delete(행 단위로 삭제)
delete 에서 whare 를 빼게 되면 테이블 전체 삭제 이므로 whare절은 써주는 것이 좋다.
delete from table
whare
※subqurey 사용 가능
롤백 가능 COMMIT 명령어를 입력해야 트랜잭션이 종료
DDL : 정의 언어 : 트랜잭션이 자동으로 시작되고 종료된다.
- 엔터를 치는 순간 트랜잭션이 종료 됨으로 롤백 불가능
ex) truncate (테이블 통째로 삭제)
insert into values
- 새로운 행 추가
- 키워드 : insert into / values
- 사용법 : insert into table (컬럼1, 컬럼2) values(컬럼1에 대한 값 , 컬럼2에 대한 값)
- 특징
- insert into 후 나열한 컬럼대로 values값을 넣지만 컬럼지정을 하지 않고 테이블만 입력 했을 경우 values값은 table의 원래 컬럼수 대로 값을 넣어줘야 한다.
- null 값을 넣기 위해서는 values 값에 null이라고 넣어주면 된다.
- values에는 특수값ex) sysdate , current_date 등 특수값을 넣을 수도 있다.
- 테이블 명을 넣고 컬럼지정을 하지 않았을 경우 desc 명령어를 통해 컬럼순서를 확인 할 수 있다.
- to_date 등 문자변환도 가능
- 다른 테이블에서 복사
- values 대신 select 문을 넣어서 다른 테이블에서 값을 가져올 수도 있다(필자 생각으로 for문과 비슷)
update / set
- 덮어쓰기
- 키워드 : update / set
- whare절은 생략이 가능하지만 생략하게 되면 테이블 전체를 업데이트 하기 때문에 whare절은 써주는 것이 좋다.
- 사용법 : update table set column = values
※subquery를 사용하여 두개의 열 갱신
set 값에 subquery 사용가능
savepoint to (트랜잭션 제어)
트랜잭션 제어
- savepoint를 만들어서 책갈피 처럼 rollback 할 위치 지정
- 사용법 : inserte 또는 update 후
- savepint 이름 : 이름은 savepoint 이름
- rollback to 이름
- rollback 이나 commit을 하게 되면 트랜잭션 종료 상태가 된다.
for update (잠금기능)
- for update
- select 문에서 for update하게 되면 잠그게 되어 다른 사용자가 접근을 하지 못한다.
- ex) job_id 가 sa_rep라는 것을 수정중이라 한다면
- where job_id = 'sa_rep'
- for update
- 라고 하게 되면 다른 사용자가 select 하게 되더라도 출력 되지 않는다.
- 화장실 문을 잠그고 볼일을 보는것과 동일하다
1. MY_EMPLOYEE라는 테이블을 생성합니다.
CREATE TABLE my_employee
(id NUMBER(4) CONSTRAINT my_employee_id_pk PRIMARY Key,
last_name VARCHAR2(25),
first_name VARCHAR2(25),
userid VARCHAR2(8),
salary NUMBER(9,2));
2. 열 이름을 식별하도록 MY_EMPLOYEE 테이블의 구조를 기술합니다.
desc my_employee
3. 다음 예제 데이터 행을 MY_EMPLOYEE 테이블에 추가하는 INSERT 문을 작성합니다.
id last_name first_name userid salary
1 Patel Ralph rpatel 895
2 Dancs Betty bdancs 860
3 Biri Ben bbiri 1100
4 Newman Chad cnewman 750
5 Repeburn Audrey aropebur 1550
insert into my_employee (id,last_name,first_name,userid,salary) values (1,'Patel','Ralph','rpatel',895);
insert into my_employee(id,last_name,first_name,userid,salary) values (2,'Dancs','Betty','bdancs',860);
insert into my_employee(id,last_name,first_name,userid,salary) values (3,'Biri','Ben','bbiri',1100);
insert into my_employee(id,last_name,first_name,userid,salary) values (4,'Newman','Chad','cnewman',750);
insert into my_employee(id,last_name,first_name,userid,salary) values (5,'Repeburn','Audrey','aropebur',1550);
4. 테이블에 추가한 내용을 확인합니다.
select *
from my_employee;
5. 데이터 추가 내용이 영구적으로 적용되도록 합니다.
commit
6. 사원 3의 성을 Drexler로 변경합니다
update my_employee
set last_name = 'Drexler'
where id like 3;
7. 급여가 $900 미만인 모든 사원에 대해 급여를 $1000로 변경합니다.
update my_employee
set salary = 1000
where salary < 900;
8. 테이블에 대한 변경 사항을 확인합니다.
commit;
9. MY_EMPLOYEE 테이블에서 Betty Dancs를 삭제합니다.
delete from my_employee
where id = 2;
10. 테이블에 대한 변경 사항을 확인합니다.
commit;
11. 보류 중인 모든 변경 사항을 커밋합니다.
commit;
12. 테이블에 추가한 내용을 확인합니다.
commit
13. 트랜잭션 처리의 중간 지점에 표시합니다.
savepoint update_done;
14. 그런 다음 MY_EMPLOYEE 테이블에서 모든 행을 삭제합니다.
delete from my_employee;
15. 테이블이 비어 있는지 확인합니다.
select *
from my_employee;
16. 이전의 INSERT 작업을 삭제하지 않은 채로 최근의 DELETE 작업을 삭제합니다.
rollback to update_done;
17. 새 행이 여전히 원래 상태를 유지하는지 확인합니다.
select *
from my_employee;
18. 데이터 추가 내용이 영구적으로 적용되도록 합니다.
commit;
19. 다음을 추가합니다.
추가할 내용 ==> 6 Anthony Mark manthony 1230
insert into my_employee
values(6,'Anthony','Mark','manthony',1230);
20. 새 행이 올바른 USERID로 추가되었는지 확인합니다
select userid
from my_employee;
테이블 생성
규칙
- 문자로 시작해야한다
- oracle 예약어는 사용 할 수 없다.
table 생성
create table table_Name
(컬럼1, 컬럼속성,
컬럼2, 컬럼속성)


Default
값을 입력하지 않으면 자동으로 Default값이 입력 되도록 하는 명령어
아래 그림의 사용 예시는 hire_date 에 값을 입력하지 않으면 sysdate(현재 날짜) 가 입력 된다.

제약조건
테이블 레벨에서 강제적으로 규칙을 생성 하는 것
- not null : null값이 들어가면 안된다, 즉 무조건 값이 있어야한다.
- unique : 오직 하나의 값만 들어가야한다. (값이 중복되면 안된다)
- primary key : not null 과 unique의 속성을 모두 가지며 기본키라고 한다, 테이블의 데이터를 쉽고 빠르게 찾도록 도와준다.
- foreign key : 외래 키 라고 부르며 테이블 끼리 연결 해주는 역할을 한다,
- check : 값이 입력될때 조건에 맞는지 확인
문법
NOT NULL
CREATE TABLE Test(
ID INT NOT NULL,
Name VARCHAR(30),
ReserveDate DATE,
RoomNum INT);
UNIQUE
CREATE TABLE Test (
ID INT UNIQUE,
Name VARCHAR(30),
ReserveDate DATE,
RoomNum INT);
PRIMARY KEY
CREATE TABLE Test (
ID INT PRIMARY KEY,
Name VARCHAR(30),
ReserveDate DATE,
RoomNum INT);
FOREIGN KEY
CREATE TABLE Test2(
ID INT,
ParentID INT,
FOREIGN KEY (ParentID)
REFERENCES Test1(ID)
ON UPDATE CASCADE);
CHECK
CREATE TABLE Customer (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int CHECK (Age>=18));
ALLTER
- 새열 추가
- 기존 열 수정
- 새 열에 기본값 정의
- 열 삭제
- 열 이름 변경
- 일기전용 상태로 테이블 변경
새 열 추가 / 기본값 변경 / 열 삭제
alter table dept80
add (job_id varchar2(9));
alter table dept80
modify (last_name varchar2(30));
기본값을 변경하면 이후에 테이블에 삽입하는 항목에만 적용된다.
alter table dept80
drop (job_id);
테이블 삭제
테이블을 recycle bin 으로 이동
purge 절이 지정되면 테이블 및 해당 데이터를 완전히 제거
drop table dept80;
[문제]
1. 다음 테이블 instance 차트를 기준으로 DEPT 테이블을 생성합니다.
열이름 ID NAME
키유형 Primary Key
Nulls/Unique
FK테이블
FK 열
데이터 유형 number varchar2
길이 7 25
2. 다음 테이블 instance 차트를 기준으로 EMP 테이블을 생성합니다.
열이름 ID LAST_NAME FIRST_NAME DEPT_ID
키유형
Nulls/Unique
FK테이블 DEPT
FK 열 ID
데이터 유형 number varchar2 varchar2 NUMBER
길이 7 25 25 7
3. EMP 테이블을 수정합니다. 전체 자릿수가 2이고 소수점 이하 자릿수가 2인 NUMBER 데이터
유형의 COMMISSION 열을 추가합니다. 수정을 확인합니다.
4. 긴 사원 성을 허용하도록 EMP 테이블을 수정합니다. 수정한 내용을 확인합니다.
5. EMP 테이블에서 FIRST_NAME 열을 삭제합니다. 테이블 설명을 검사하여 수정 사항을
확인합니다.
6. EMP 테이블에서 DEPT_ID 열을 UNUSED로 표시합니다. 테이블 설명을 검사하여 수정
사항을 확인합니다.
7. EMP 테이블에서 UNUSED 열을 모두 삭제합니다.
8. EMPLOYEES 테이블의 구조를 기준으로 EMPLOYEES2 테이블을 생성합니다. EMPLOYEE_ID,
FIRST_NAME, LAST_NAME, SALARY 및 DEPARTMENT_ID 열만 포함합니다. 새 테이블에서
열 이름을 각각 ID, FIRST_NAME, LAST_NAME, SALARY 및 DEPT_ID로 지정합니다.
테이블이 생성되었는지 확인합니다.
9. EMPLOYEES2 테이블 상태를 읽기 전용으로 변경합니다.
10. EMPLOYEES2 테이블에서 JOB_ID 열을 추가해 보십시오.
주: “Update operation not allowed on table” 오류 메시지가 나타납니다. 테이블의 상태가
읽기 전용으로 지정되어 있으므로 열을 추가할 수 없습니다.
11. EMPLOYEES2 테이블을 읽기/쓰기 상태로 복귀시킵니다. 이제 동일한 열을 다시 추가해
봅니다.
테이블의 상태가 READ WRITE로 지정되어 있으므로 열을 테이블에 추가할 수 있습니다.
12. EMP, DEPT 및 EMPLOYEES2 테이블을 삭제합니다.
주: READ ONLY 모드인 테이블도 삭제할 수 있습니다. 이를 테스트하려면 테이블을 다시
READ ONLY 상태로 변경한 다음 DROP TABLE 명령을 실행합니다. 테이블이 삭제됩니다.
[해답]
1. 다음 테이블 instance 차트를 기준으로 DEPT 테이블을 생성합니다.
열이름 ID NAME
키유형 Primary Key
Nulls/Unique
FK테이블
FK 열
데이터 유형 number varchar2
길이 7 25
CREATE TABLE dept
(id NUMBER(7)CONSTRAINT department_id_pk PRIMARY KEY,
name VARCHAR2(25));
2. 다음 테이블 instance 차트를 기준으로 EMP 테이블을 생성합니다.
열이름 ID LAST_NAME FIRST_NAME DEPT_ID
키유형
Nulls/Unique
FK테이블 DEPT
FK 열 ID
데이터 유형 number varchar2 varchar2 NUMBER
길이 7 25 25 7
CREATE TABLE emp
(id NUMBER(7),
last_name VARCHAR2(25),
first_name VARCHAR2(25),
dept_id NUMBER(7)
CONSTRAINT emp_dept_id_FK foreign key(dept_id) REFERENCES dept (id)
);
3. EMP 테이블을 수정합니다. 전체 자릿수가 2이고 소수점 이하 자릿수가 2인 NUMBER 데이터 유형의 COMMISSION 열을 추가합니다. 수정을 확인합니다.
ALTER TABLE emp
ADD commission NUMBER(2,2);
DESCRIBE emp
4. 긴 사원 성을 허용하도록 EMP 테이블을 수정합니다. 수정한 내용을 확인합니다.
ALTER TABLE emp
MODIFY (last_name VARCHAR2(50));
DESCRIBE emp
5. EMP 테이블에서 FIRST_NAME 열을 삭제합니다. 테이블 설명을 검사하여 수정 사항을
확인합니다.
ALTER TABLE emp
DROP COLUMN first_name;
DESCRIBE emp
6. EMP 테이블에서 DEPT_ID 열을 UNUSED로 표시합니다. 테이블 설명을 검사하여 수정
사항을 확인합니다.
ALTER TABLE emp
SET UNUSED (dept_id);
DESCRIBE emp
7. EMP 테이블에서 UNUSED 열을 모두 삭제합니다.
ALTER TABLE emp
DROP UNUSED COLUMNS;
8. EMPLOYEES 테이블의 구조를 기준으로 EMPLOYEES2 테이블을 생성합니다.
EMPLOYEE_ID,FIRST_NAME, LAST_NAME, SALARY 및 DEPARTMENT_ID 열만 포함합니다.
새 테이블에서 열 이름을 각각 ID, FIRST_NAME, LAST_NAME, SALARY 및 DEPT_ID로 지정합니다. 테이블이 생성되었는지 확인합니다.
create table employees2(id,first_name,last_name,salary,dept_id)
as
select employee_id,first_name,last_name,salary,department_id
from employees;
DESCRIBE employees2
9. EMPLOYEES2 테이블 상태를 읽기 전용으로 변경합니다.
ALTER TABLE employees2 READ ONLY;
10. EMPLOYEES2 테이블에서 JOB_ID 열을 추가해 보십시오.
ALTER TABLE employees2
ADD (job_id VARCHAR2(9));
11. EMPLOYEES2 테이블을 읽기/쓰기 상태로 복귀시킵니다. 이제 동일한 열을 다시 추가해
봅니다. 테이블의 상태가 READ WRITE로 지정되어 있으므로 열을 테이블에 추가할 수 있습니다.
ALTER TABLE employees2 READ WRITE;
ALTER TABLE employees2
ADD job_id VARCHAR2(9);
DESCRIBE employees2
12. EMP, DEPT 및 EMPLOYEES2 테이블을 삭제합니다.
주: READ ONLY 모드인 테이블도 삭제할 수 있습니다. 이를 테스트하려면 테이블을 다시
READ ONLY 상태로 변경한 다음 DROP TABLE 명령을 실행합니다. 테이블이 삭제됩니다.
DROP TABLE emp;
DROP TABLE dept;
DROP TABLE employees2;