[ DML 목차 ]
1. INSERT 문
1) INSERT 구문 오류 발생 예시
2) 컬럼명을 생략한 INSERT 구문
3) NULL 값을 삽입하는 다양한 방법
4) 서브 쿼리로 데이터 삽입
2. 다중 테이블에 다중행 입력하기
3. UPDATE 문
1) 테이블 모든 행 변경
2) 테이블 특정 행만 변경
3) 테이블에서 2개 이상의 컬럼값 변경
4) 서브 쿼리를 이용한 데이터 수정
4. DELETE 문
1) DELETE 이용하여 행 삭제
2) 조건 제시하여 특정 행만 삭제
3) 서브 쿼리를 이용한 데이터 삭제
5. 테이블 합병 MERGE
[ 1 ] 테이블에 새로운 행 추가하는 INSERT 문
- INSERT 문
: 테이블에 새로운 데이터를 입력하기 위해 사용하는 데이터 조작어
-- 1. INSERT문
DESC DEPT01;
ALTER TABLE DEPT01
ADD(LOC VARCHAR2(10)); -- LOC이 없었어서 추가해줌
INSERT INTO DEPT01 VALUES(10, 'ACCOUNTING', 'NEW YORK');
SELECT * FROM DEPT01;
INSERT INTO DEPT01 VALUES(30, 'DEVELOPMENT', 'NULL');
-- INSERT INTO DEPT01 VALUES(30, 'DEVELOPMENT');
-- 이렇게 컬럼의 갯수 맞추지 않고 INSERT 하려고 하면 안들어간다.
-- INSERT 구문의 오류 발생 예시 중 하나
-- 원인 : 컬럼명에 기술된 목록의 수는 3개인데 VALUES 괄호안에 기술된 값은 2개로
-- 3개보다 적어서 오류 발생
INSERT INTO DEPT01 (DEPTNO, DNAME) VALUES (40, 'SALES');
-- 특정 컬럼에만 값을 INSERT 하고 싶다면 위에와 같은 형식으로 INSERT 해줘야 한다.
[ 실습 : INSERT 문 실습에 사용할 테이블 생성하기 ]
- INSERT문을 위한 실습을 하기에 앞서 실습에 사용할 테이블을
CREATE TABLE 명령어로 새롭게 만들어 보자.
-- 기존에 있던 부서 테이블(DEPT)과 동일한 구조를 갖되 데이터는 복사하지 않는 테이블을 생성한다.
-- 데이터 없이 테이블 틀만 복사해오자.
DROP TABLE DEPT01;
CREATE TABLE DEPT01
AS
SELECT * FROM DEPT
WHERE 1=0;
-- 생성된 테이블의 구조를 살펴본다.
DESC DEPT01;
-- 수록된 데이터를 살펴본다.
SELECT * FROM DEPT01;
1. INSERT 구문의 오류 발생 예
- 다음과 같은 경우 에러 발생한다.
1) 컬럼명에 기술된 목록 수보다 VALUES 다음에 나오는 괄호 안에
기술한 값의 개수가 적을 때
2) 컬럼명에 기술된 목록의 수보다 VALUES 다음에 나오는 괄호 안에
기술한 값의 개수가 많을 때
3) 컬럼명이 잘못 입력되었을 때
4) 컬럼과 입력할 값의 데이터 타입이 서로 맞지 않을 때
INSERT INTO DEPT01
(DEPTNO, DNAME, LOC)
VALUES (10, 'ACCOUNTING');
INSERT INTO DEPT01
(DEPTNO, DNAME, LOC)
VALUES (10, 'ACCOUNTING', 'NEW YORK', 20);
-- 컬럼 개수는 3개인데 삽입하려는 컬럼의 개수가 4개라서 오류발생
INSERT INTO DEPT01
(NUM, DNAME, LOC)
VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT01
(DEPTNO, DNAME, LOC)
VALUES (10, ACCOUNTING, 'NEW YORK');
-- 아래 쉅 내용 코드 --
-- INSERT 구문의 오류 발생 예 1.
INSERT INTO DEPT01
(DEPTNO, DNAME, LOC) VALUES (30, 'ACCOUNTING', '서울', 20);
INSERT INTO DEPT01 VALUES (40, '영업부', NULL);
-- NULL 값을 삽입하는 방법
-- 암시적으로 NULL 값의 삽입
INSERT INTO DEPT01 (DEPTNO, DNAME) VALUES(20,'개발부');
-- 명시적으로 NULL 값의 삽입
INSERT INTO DEPT01 VALUES (40, '영업부', NULL);
2. 컬럼명을 생략한 INSERT 구문
- 테이블에 로우를 추가할 때 모든 컬럼에 모두 자료를 입력하는 경우
굳이 컬럼 목록을 기술하지 않아도 된다.
- 컬럼 목록을 생략하면 VALUES 절 다음의 값들을 테이블의 기본
컬럼 순서대로 입력한다.
- 테이블의 컬럼 순서
: CREATE TABLE 로 테이블 생성할 때의 순서를 따름
- 테이블의 기본 컬럼 순서
: DESC 문으로 조회했을 때 보여지는 순서
INSERT INTO DEPT01
VALUES (20, 'RESEARCH', 'DALLAS');
SELECT * FROM DEPT01;
3. NULL 값을 삽입하는 다양한 방법
- 부서 테이블에 컬럼이 NULL 값을 허용하는지 살펴보기 위해
DESC 명령을 먼저 실행한다.
- DEPT 테이블의 DEPTNO 컬럼은 NOT NULL 제약조건이
지정되어 있다.
- NOT NULL 제약 조건이 지정된 DEPTNO 컬럼은
널 값을 입력하지 못한다.
- 오라클이 제공해주는 DEPT 테이블의 DEPTNO 컬럼에
널 값을 허용하지 못하도록 오라클 내부에서 이미 컬럼에
제약조건을 지정해 놓은 상태이다.
- 컬럼에 널값을 넣는 것을 허용하지 못하도록 하려면
컬럼에 제약조건을 지정해줘야 한다.
( 1 ) 암시적으로 NULL 값의 삽입
- 저장할 값을 명확하게 알고 있는 컬럼명만 명시적으로 기술한 후에
그에 매칭되는 값을 VALUES 절 다음에 적어준다.
INSERT INTO DEPT01
(DEPTNO, DNAME)
VALUES (30, 'SALES');
-- 아래 쉅 내용 코드 --
-- 암시적으로 NULL 값의 삽입
INSERT INTO DEPT01 (DEPTNO, DNAME) VALUES(20,'개발부');
( 2 ) 명시적으로 NULL 값의 삽입
- 컬럼명을 명시적으로 기술하지 않으면 테이블이 갖고 있는
모든 컬럼에 값을 지정해줘야 한다.
INSERT INTO DEPT01
VALUES (40, 'OPERATIONS', NULL);
-- 아래 쉅 내용 코드 --
-- 명시적으로 NULL 값의 삽입
INSERT INTO DEPT01 VALUES (40, '영업부', NULL);
4. 서브 쿼리로 데이터 삽입하기
- INSERT INTO 다음에 VALUES 절을 사용하는 대신에 서브 쿼리를 사용할 수 있다.
- 주의할 점!
INSERT 명령문에서 지정한 컬럼의 개수나 데이터 타입이 서브 쿼리를 수행한 결과와
동일해야 한다.
[ 실습 : 서브 쿼리로 데이터를 삽입하는 예제 ]
- INSERT INTO 다음에 VALUES 절을 사용하는 대신 서브 쿼리를 사용하여 데이터를 추가
DROP TABLE DEPT02;
CREATE TABLE DEPT02
AS
SELECT * FROM DEPT WHERE 1=0;
SELECT * FROM DEPT02;
INSERT INTO DEPT02
SELECT * FROM DEPT;
SELECT * FROM DEPT02;
-- 아래 쉅 내용 코드 --
-- 서브쿼리로 데이터 삽입하기
DROP TABLE DEPT02;
CREATE TABLE DEPT02
AS
SELECT * FROM DEPT WHERE 1=0; -- 테이블 틀만 복사
SELECT * FROM DEPT02; -- 데이터 없이 테이블 틀만 복사된 것을 볼 수 있다.
INSERT INTO DEPT02 -- 메인 쿼리로 보는 것
--VALUES( ); -- 이걸로 안하고아래의 코드와 같이 데이터 삽입한다.
SELECT * FROM DEPT; -- 서브 쿼리로 보는 것,,
[ 2 ] 다중 테이블에 다중행 입력하기 ( 코드 빠르게 슈슉 한번 보시고 그냥 넘어가심,,)
- INSERT ALL 명령문
: 서브 쿼리의 결과 집합을 조건 없이 여러 테이블에
동시에 입력하기 위한 명령문
[ 실습 : INSERT ALL 명령문으로 다중 테이블에 다중행 입력하기 ]
DESC EMP
SELECT * FROM EMP
WHERE DEPTNO=20;
DROP TABLE EMP_HIR;
CREATE TABLE EMP_HIR
AS
SELECT EMPNO, ENAME, HIREDATE FROM EMP
WHERE 1=0;
SELECT * FROM EMP_HIR;
DROP TABLE EMP_MGR;
CREATE TABLE EMP_MGR
AS
SELECT EMPNO, ENAME, MGR FROM EMP
WHERE 1=0;
SELECT * FROM EMP_MGR;
INSERT ALL
INTO EMP_HIR VALUES(EMPNO, ENAME, HIREDATE)
INTO EMP_MGR VALUES(EMPNO, ENAME, MGR)
SELECT EMPNO, ENAME, HIREDATE, MGR
FROM EMP
WHERE DEPTNO=20;
SELECT * FROM EMP_HIR;
SELECT * FROM EMP_MGR;
-- 아래 쉅 내용 코드 --
-- 다중 테이블에 다중행 입력하기
DESC EMP
SELECT * FROM EMP
WHERE DEPTNO=20;
DROP TABLE EMP_HIR;
CREATE TABLE EMP_HIR
AS
SELECT EMPNO, ENAME, HIREDATE FROM EMP
WHERE 1=0;
SELECT * FROM EMP_HIR;
DROP TABLE EMP_MGR;
CREATE TABLE EMP_MGR
AS
SELECT EMPNO, ENAME, MGR FROM EMP
WHERE 1=0;
SELECT * FROM EMP_MGR;
INSERT ALL
INTO EMP_HIR VALUES(EMPNO, ENAME, HIREDATE)
INTO EMP_MGR VALUES(EMPNO, ENAME, MGR)
SELECT EMPNO, ENAME, HIREDATE, MGR
FROM EMP
WHERE DEPTNO=20;
-- 테이블 EMP_HIR과 EMP_MGR에 데이터를 동시에 넣고 있다.
SELECT EMPNO, ENAME, HIREDATE, MGR
FROM EMP
WHERE DEPTNO=20;
-- 여기 EMP 테이블에서의 각 컬럼에서 EMP_HIR에 필요한것만,
-- EMP_MGR에 필요한 컬럼들만 가져다가 삽입해준 것이다.
SELECT * FROM EMP_HIR;
SELECT * FROM EMP_MGR;
[ 실습 : INSERT ALL 명령에 조건 (WHEN)으로 다중 테이블에 다중행 입력하기 ]
DROP TABLE EMP_HIR02;
CREATE TABLE EMP_HIR02
AS
SELECT EMPNO, ENAME, HIREDATE FROM EMP
WHERE 1=0;
SELECT * FROM EMP_HIR02;
DROP TABLE EMP_SAL;
CREATE TABLE EMP_SAL
AS
SELECT EMPNO, ENAME, SAL FROM EMP
WHERE 1=0;
SELECT * FROM EMP_SAL;
INSERT ALL
WHEN HIREDATE > '1982/01/01' THEN
INTO EMP_HIR02 VALUES(EMPNO, ENAME, HIREDATE)
WHEN SAL > 2000 THEN
INTO EMP_SAL VALUES(EMPNO, ENAME, SAL)
SELECT EMPNO, ENAME, HIREDATE, SAL FROM EMP;
SELECT * FROM EMP_HIR02;
SELECT * FROM EMP_SAL;
-- 아래 쉅 내용 코드 --
--- [ 실습 : INSERT ALL 명령에 조건 (WHEN)으로 다중 테이블에 다중행 입력하기 ] ----
DROP TABLE EMP_HIR02;
CREATE TABLE EMP_HIR02
AS
SELECT EMPNO, ENAME, HIREDATE FROM EMP
WHERE 1=0;
SELECT * FROM EMP_HIR02;
DROP TABLE EMP_SAL;
CREATE TABLE EMP_SAL
AS
SELECT EMPNO, ENAME, SAL FROM EMP
WHERE 1=0;
SELECT * FROM EMP_SAL;
INSERT ALL
WHEN HIREDATE > '1982/01/01' THEN -- 이 조건을 만족하면 EMP_HIR02 테이블에 데이터 삽입하는 것
INTO EMP_HIR02 VALUES(EMPNO, ENAME, HIREDATE)
WHEN SAL > 2000 THEN
INTO EMP_SAL VALUES(EMPNO, ENAME, SAL)
SELECT EMPNO, ENAME, HIREDATE, SAL FROM EMP;
-- EMP 테이블에서 EMPNO, ENAME, HIREDATE, SAL 컬럼들을 가져와서
-- HIREDATE > '1982/01/01 조건을 만족하면 EMP_HIR02 테이블에
-- (EMPNO, ENAME, HIREDATE) 이 컬럼들의 데이터를 삽입해주고
-- SAL > 2000 조건을 만족하면
-- EMP_SAL 테이블에 (EMPNO, ENAME, SAL) 컬럼들 데이터를 삽입해준다.
SELECT * FROM EMP_HIR02;
SELECT * FROM EMP_SAL;
[ 3 ] 테이블의 내용을 수정하기 위한 UPDATE문
- UPDATE문
: 테이블에 저장된 데이터를 수정하기 위해 사용
-- 형식
UPDATE table_name
SET column_name1 = value1, column_name2 = value2, …
WHERE conditions;
1. 테이블의 모든 행 변경
DROP TABLE EMP01;
DROP TABLE EMP01 CASCADE CONSTRAINTS;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
UPDATE EMP01
SET DEPTNO = 30;
SELECT * FROM EMP01;
UPDATE EMP01
SET SAL = SAL * 1.1;
SELECT * FROM EMP01;
UPDATE EMP01
SET HIREDATE = SYSDATE;
SELECT * FROM EMP01;
-- 아래 쉅 내용 코드 --
-- UPDATE문
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01
ORDER BY SAL ASC;
UPDATE EMP01
SET DEPTNO = 30; -- 테이블 모든 행 변경
UPDATE EMP01
SET SAL = SAL * 1.1;
ROLLBACK; -- 롤백하면 그 앞에 업데이트 하기 완전 전으로 돌아간다,,
UPDATE EMP01
SET HIREDATE = SYSDATE;
SELECT * FROM EMP01;
2. 테이블의 특정 행만 변경
- UPDATE 문에 WHERE 절을 추가하면 테이블의 특정 행이 변경된다.
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
UPDATE EMP01
SET DEPTNO = 30
WHERE DEPTNO = 10;
SELECT * FROM EMP01;
UPDATE EMP01
SET SAL = SAL * 1.1
WHERE SAL >= 3000;
SELECT * FROM EMP01;
UPDATE EMP01
SET HIREDATE = SYSDATE
WHERE SUBSTR(HIREDATE, 1, 2) = '87';
SELECT * FROM EMP01;
-- 아래 쉅 내용 코드 --
--- 2. 테이블 특정 행만 변경 ---
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
UPDATE EMP01
SET DEPTNO=30
WHERE DEPTNO=10; -- 특정 행만 변경
UPDATE EMP01
SET SAL = SAL * 1.1
WHERE SAL < 3000;
UPDATE EMP01
SET HIREDATE = SYSDATE
WHERE SUBSTR(HIREDATE, 1, 2) = '87';
-- HIREDATE에서 첫번째에서 두개를 추출했을 때 87인 경우
3. 테이블에서 2개 이상의 컬럼값 변경
- 테이블에서 하나의 컬럼이 아닌 복수 개의 컬럼의 값을 변경하려면
기존 SET 절에 콤마를 추가하고 컬럼 = 값을 추가 기술하면 된다.
* 변경할 컬럼들을 콤마 ( , ) 로 조건절에 나열해주면 된다.
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
UPDATE EMP01
SET DEPTNO=20, JOB='MANAGER'
WHERE ENAME='SCOTT';
SELECT * FROM EMP01 WHERE ENAME='SCOTT';
UPDATE EMP01
SET HIREDATE = SYSDATE, SAL=50, COMM=4000
WHERE ENAME='SCOTT';
SELECT * FROM EMP01 WHERE ENAME='SCOTT';
-- 아래 쉅 내용 코드 --
--- 3. 테이블에서 2개 이상의 컬럼값 변경 ---
-- 앞서서는 계속 컬럼 1개의 값만 변경했음 --
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
UPDATE EMP01
SET DEPTNO=20, JOB='MANAGER'
WHERE ENAME='SCOTT';
UPDATE EMP01
SET HIREDATE = SYSDATE, SAL = 3500, COMM = 4000
WHERE ENAME = 'SCOTT';
4. 서브 쿼리를 이용한 데이터 수정하기
- UPDATE 문의 SET 절에서 서브 쿼리를 기술하면
서브 쿼리를 수행한 결과로 내용이 변경된다.
- 이러한 방법으로 다른 테이블에 저장된 데이터로
해당 컬럼 값을 변경할 수 있다.
-- 형식 1
UPDATE table_name
SET column_name1 = (sub_query1), column_name2 = (sub_query2), …
WHERE 조건
-- 형식 2
UPDATE table_name
SET (column_name1, column_name2, …) = (sub_query)
WHERE 조건
-- 예
UPDATE DEPT01
SET LOC=(SELECT LOC
FROM DEPT01
WHERE DEPTNO=20);
-- 아래 쉅 내용 코드 --
-- 서브 쿼리를 이용한 데이터 수정 --
SELECT * FROM DEPT01;
UPDATE DEPT01
SET LOC = (SELECT LOC FROM DEPT WHERE DEPTNO=20);
[ 4 ] 테이블의 불필요한 행을 삭제하기 위한 DELETE문
1. DELETE문을 이용한 행 삭제
- DELETE 문
: 테이블의 기존 행을 삭제하며 특정한 로우(행)을 삭제하기 위해서
WHERE 절을 이용하여 조건을 지정한다.
-- 형식
DELETE FROM table_name
WHERE conditions;
-- 예
DELETE FROM DEPT01;
-- 아래 쉅 내용 코드 --
-- 서브 쿼리를 이용한 데이터 수정 --
-- DELETE 문 --
-- 1. DELETE문 이용하여 행 삭제
DELETE FROM DEPT01; -- DEPT01 테이블에 있는 데이터 모두 지움
SELECT * FROM DEPT01;
ROLLBACK; -- DELETE하기 전으로 데이터 복구 가능
DELETE FROM DEPT01
WHERE DEPTNO=30; -- 2. 조건 제시하여 특정 행만 삭제
DELETE FROM DEPT01
WHERE DEPTNO = ( SELECT DEPTNO FROM DEPT WHERE DNAME = 'RESEARCH' ); -- 3. 서브 쿼리를 이용한 데이터 삭제
SELECT DEPTNO FROM DEPT WHERE DNAME = 'RESEARCH'; -- DEPTNO = 20
2. 조건을 제시하여 특정 행만 삭제하는 법
DELETE FROM DEPT01
WHERE DEPTNO=30;
3. 서브 쿼리를 이용한 데이터 삭제
DELETE FROM DEPT01
WHERE DEPTNO=(SELECT DEPTNO
FROM DEPT
WHERE DNAME='SALES');
[ 5 ] 테이블을 합병하는 MERGE ( 잘,, 안 사용한다,,)
- MERGE
: 합병이라는 의미
구조가 같은 두개의 테이블을 하나의 테이블로 합치는 기능
- MERGE 명령을 수행하기 위해서 수행하는 테이블에
기존에 존재하는 행이 있다면 새로운 값으로 갱신(UPDATE)되고,
존재하지 않으면 새로운 행으로 추가(INSERT) 된다.
* 기존에 있는 데이터는 UPDATE로 MERGE 하고
기존에 없던 데이터는 INSERT로 MERGE 한다.
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
DROP TABLE EMP02;
CREATE TABLE EMP02
AS
SELECT * FROM EMP
WHERE JOB='MANAGER';
SELECT * FROM EMP02;
UPDATE EMP02
SET JOB='TEST';
SELECT * FROM EMP02;
INSERT INTO EMP02
VALUES(8000, 'SYJ', 'TOP', 7566, '2009/01/12', 1200, 10, 20);
MERGE INTO EMP01
USING EMP02
ON(EMP01.EMPNO=EMP02.EMPNO)
WHEN MATCHED THEN
UPDATE SET
EMP01.ENAME=EMP02.ENAME,
EMP01.JOB=EMP02.JOB,
EMP01.MGR=EMP02.MGR,
EMP01.HIREDATE=EMP02.HIREDATE,
EMP01.SAL=EMP02.SAL,
EMP01.COMM=EMP02.COMM,
EMP01.DEPTNO=EMP02.DEPTNO
WHEN NOT MATCHED THEN
INSERT VALUES(EMP02.EMPNO, EMP02.ENAME, EMP02.JOB,
EMP02.MGR, EMP02.HIREDATE, EMP02.SAL,
EMP02.COMM, EMP02.DEPTNO);
SELECT * FROM EMP01;
-- 아래 쉅 내용 코드 --
----- MERGE ----
DROP TABLE EMP01;
CREATE TABLE EMP01
AS
SELECT * FROM EMP;
SELECT * FROM EMP01;
DROP TABLE EMP02;
CREATE TABLE EMP02
AS
SELECT * FROM EMP
WHERE JOB='MANAGER';
SELECT * FROM EMP02;
UPDATE EMP02
SET JOB='TEST';
SELECT * FROM EMP02;
-- 기존에 없던 데이터 새롭게 추가 --
INSERT INTO EMP02
VALUES(8000, 'SYJ', 'TOP', 7566, '2009/01/12', 1200, 10, 20);
-- EMP02를 가지고 EMP01에 MERGE 합병 하려는 것 --
-- EMP02 -- MERGE --> EMP01
-- MERGE 를 할땐 UPDATE를 해줘야하는데 EMP02에 기존에 있던건 UPDATE로 MERGE해주고
-- EMP02에 새롭게 추가한 데이터는 INSERT해서 EMP01에 MERGE해줘야한다.
MERGE INTO EMP01
USING EMP02
ON(EMP01.EMPNO=EMP02.EMPNO) -- EMPNO을 가지고 데이터가 같은지 아닌지 확인하겠다.
WHEN MATCHED THEN
UPDATE SET
EMP01.ENAME=EMP02.ENAME,
EMP01.JOB=EMP02.JOB,
EMP01.MGR=EMP02.MGR,
EMP01.HIREDATE=EMP02.HIREDATE,
EMP01.SAL=EMP02.SAL,
EMP01.COMM=EMP02.COMM,
EMP01.DEPTNO=EMP02.DEPTNO
WHEN NOT MATCHED THEN -- 매치가 안된다는 건 EMP01.EMPNO != EMP02.EMPNO 이라는 거고 그건 EMP01에는 없고 EMP02엔 있다는 거니깐 새로 추가된 데이터라는 뜻
INSERT VALUES(EMP02.EMPNO, EMP02.ENAME, EMP02.JOB,
EMP02.MGR, EMP02.HIREDATE, EMP02.SAL,
EMP02.COMM, EMP02.DEPTNO);
-- JOB이 MANAGER 였던 사람들은 UPDATE 되어서 MERGE 되었고
-- ENAME 'SYJ' 인 애는 기존에 없던 데이터여서 INSERT 되어서 MERGE 되었다.
SELECT * FROM EMP01;
INSERT INTO EMP01 (EMPNO, ENAME) VALUES (7369, '홍길동');
-- 이미 EMPNO이 7369인 사람이 존재하지만 위의 데이터가 또 추가가 된다.
DESC EMP; -- 여기서 보면 EMPNO 은 NOT NULL이다.
-- EMPNO : 제약조건(PRIMARY KEY = NOT NULL + UNIQUE, 기본키) <-- 값을 꼭 넣어줘야한다. 값을 안넣어주면 안된다.
INSERT INTO EMP (EMPNO, ENAME) VALUES (7369, '홍길동'); -- ORA-00001: unique constraint (SCOTT.PK_EMP) violated 오류 발생
-- 이미 EMPNO에 7369가 있기 때문에 또 EMPNO이 7369인 데이터를 추가할 수가 없다. 왜? 중복되니깐
-- EMPNO은 NOT NULL + UNIQUE인 제약조건이 있기 때문에 중복된 데이터 들어갈 수 없다.
-- 그래서 위에서 중복된 값 추가하려고 하니 오류가 발생한것이다.
'DataBase' 카테고리의 다른 글
12_ 데이터 읽기 일관성과 락 (0) | 2022.12.16 |
---|---|
11_ 트랜잭션 관리 (0) | 2022.12.16 |
09_DDL (1) | 2022.12.15 |
08_서브 쿼리 (0) | 2022.12.14 |
07_조인 (0) | 2022.12.14 |