데이터 조작언어 ( DATA MANIPULATION LANGUAGE, DML) 에 해당하는 INSERT에 대해 알아보자.
INSERT 후 COMMIT 또는 ROLLBACK으로 트랜잭션을 완료 해야 한다.
COMMIT 트랜잭션 완료 (테이블에 저장 완료)ROLLBACK 트랜잭션 취소 (테이블 저장 취소)
데이터 조작언어를 실행 후 DDL(Data Definition Language : CREATE, ALTER, DROP)명령을 실행하면 자동 COMMIT 된다.
예를 들어 INSERT 후 CREATE 명령을 실행하면 INSERT 후 CREATE 명령을 실행하면 INSERT는 COMMIT 된다.
제약조건을 위반하거나 데이터 타입이 일치하지 않거나, 데이터 폭이 적으면 INSERT는 실행되지 않고 에러가 발생된다.
※ 자바 등 응용프로그램에서 INSERT 하면 기본적으로 자동 COMMIT 된다.
위험한 상황이 발생될 수 있으므로 VS Code를 사용한다면 자동으로 COMMIT 되지 않도록 설정을 해야한다.
SET AUTOCOMMIT OFF;
CREATE TABLE test1 (
num NUMBER PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
birth DATE NOT NULL,
memo VARCHAR2(1000)
);
INSERT INTO test1 VALUES(1, '홍길동', '2000-10-10', '테스트입니다');
-- VSCODE 에서는 에러. 년-월-일이 미국식으로 되어있기 때문에 TO_DATE를 써줘야한다.
-- sqldeveloper 에서는 가능.
INSERT INTO test1 VALUES(1, '홍길동', TO_DATE('2000-10-10', 'YYYY-MM-DD'), '테스트입니다');
SELECT * FROM test1;
-- 제대로 INSERT가 되었는지 확인
INSERT INTO test1 VALUES(2, '김자바', TO_DATE('2000-11-11', 'YYYY-MM-DD'), '테스트2');
COMMIT; -- 트랜잭션 완료
INSERT INTO test1 VALUES(3, '이이이', TO_DATE('2000-11-11', 'YYYY-MM-DD') );
-- 에러. 컬럼의 개수와 값의 개수가 다름
-- 컬럼명을 명시해서 데이터 추가
INSERT INTO test1 (num, name, birth) VALUES(3, '이이이', TO_DATE('2000-11-11', 'YYYY-MM-DD') );
-- memo는 제약조건이 없기 때문에 NULL이어도 추가가 가능하다.
-- 하지만 테이블명 뒤에 컬럼명을 명시하지 않으면
-- 가지고 있는 모든 컬럼에 값을 넣는 다는 의미이므로 컬럼의 개수와 값의 개수를 맞춰주어야 한다.
INSERT INTO test1 (num, name, birth, memo)
VALUES(1, '나나나', TO_DATE('2000-11-11', 'YYYY-MM-DD'), '테스트' );
-- 에러 ORA-00001 제약조건 위반(기본키 제약 조건 위반)
-- num 은 PRIMARY KEY이므로 중복값을 가질 수 없다.
INSERT INTO test1 (num, name) VALUES(4, '나나나');
-- 에러 ORA-01400: cannot insert NULL into ("SKY"."TEST1"."BIRTH")
-- birth는 NOT NULL로 null을 추가할 수 없다.
INSERT INTO test1 (num, name, birth) VALUES(4, '나나나', '05/05/80' );
-- 에러 : ORA-01843: not a valid month 날짜 형식 오류
INSERT INTO test1 (num, name, birth) VALUES(4, '나나나', TO_DATE('05/05/80', 'MM/DD/RR') );
SELECT * FROM test1; -- INSERT가 잘 되었는지 확인
INSERT INTO test1 (num, name, birth,memo)
VALUES(5, '다다다', TO_DATE('90/05/05', 'RR/MM/DD/'), '');
-- ''는 NULL 임. 문자열 길이가 0임.
INSERT INTO test1 (num, name, birth,memo)
VALUES(6, '로로로', TO_DATE('90/05/05', 'RR/MM/DD/'), NULL);
INSERT INTO test1 (num, name, birth,memo)
VALUES(7, '가나다라마바사아자차파', TO_DATE('90/05/05', 'RR/MM/DD/'), NULL);
-- 에러 : ORA-12899 입력 문자열길이가 폭보다 크다.
-- 한글은 1글자에 3byte를 차지하므로 VARCHAR2에서 30을 줬으므로 10글자만 가능하다.
ROLLBACK; -- 트랜잭션 취소(테이블에 저장되지 않음)
SELECT * FROM test1;
-- 따라서 확인해보면 위에서 COMMIT을 했었던 홍길동과 김자바만 들어가 있는 것을 확인 할 수 있다.
-- test1 테이블에 다음의 컬럼을 추가한다.
-- 컬럼명 : reg_date 타입 : TIMESTAMP
ALTER TABLE test1 ADD ( reg_date TIMESTAMP);
-- test1 테이블에 다음의 데이터를 추가한다.
-- num : 3, name : 너너너, birth : 950101, reg_date : 2021 08 10 10 10 10 777
INSERT INTO test1 ( num, name, birth, reg_date)
VALUES( 3, '너너너', TO_DATE('950101', 'RRMMDD'),
TO_TIMESTAMP('20210810101010777', 'YYYYMMDDHH24MISSFF3'));
COMMIT;
SELECT * FROM test1;
'쌍용강북교육센터 > 8월' 카테고리의 다른 글
0810_Oracle : UPDATE 를 활용해 데이터를 수정해보자 (1) | 2021.08.11 |
---|---|
0810_Oracle : 가상컬럼 Virtual Column (1) | 2021.08.11 |
0810_Oracle : DROP TABLE 을 통해 삭제한 테이블 복원하기, 휴지통 비우기 (2) | 2021.08.10 |
0810_Oracle : 꼭 기억해야하는 문장들 SELECT, INSERT, UPDATE, DELETE, CREATE (1) | 2021.08.10 |
0809_Oracle : 분석함수, 데이터 정의언어 (2) | 2021.08.10 |