[SQL] DML : INSERT, UPDATE, DELETE

📁 INSERT

테이블에 새로운 행을 추가하는 구문

1) INSERT INTO

컬럼명 생략

컬럼의 순서를 아는 경우

INSERT INTO 테이블명 VALUES(데이터, 데이터, 데이터...);

컬럼 명시

컬럼의 순서, 데이터를 넣을 컬럼을 임의로 지정

INSERT INTO 테이블명(컬럼명, 컬럼명, 컬럼명)
VALUES(컬럼명, 컬럼명, 컬럼명);

서브쿼리 사용

서브쿼리를 통해 조회한 열들을 테이블에 삽입할 수 있다.

VALUES를 사용하지 않는다.

INSERT INTO 테이블명(서브쿼리)
INSERT INTO EMPLOYEE
(SELECT * FROM EMPLOYEE
WHERE SALARY>6000000)

2) INSERT ALL

한번에 여러 테이블에 행을 추가하는 구문

반드시 서브쿼리와 함께 사용해야 한다.

INSERT ALL
INTO MEMBER VALUES('id', 'pass')
INTO VISIT VALUES('id', SYSDATE)
SELECT * FROM DUAL
INSERT ALL
INTO MEMBER_U VALUES(ID, PW)
INTO VISIT VALUES(ID, 'U')
SELECT * FROM MEMBER WHERE AUTHORITY='U';

WHEN THEN

서브쿼리 결과의 조건에 따라 서로 다른 테이블에 삽입하는 구문

-- 일반회원은 MEMBER_U 테이블에, 관리자는 MEMBER_A 테이블에 삽입
INSERT ALL
WHEN AUTHORITY = 'U' THEN
	INTO MEMBER_U VALUES(ID, PW)
WHEN AUTHORITY = 'A' THEN
	INTO MEMBER_A VALUES(ID, PW)
SELECT * FROM MEMBER;

3) INSERT FIRST

기본적으로 조건을 충족하는 테이블에 행이 삽입되지만, 선행조건에서 이미 삽입된 행은 다른 테이블에 삽입되지 않는다.

INSERT ALL의 WHEN THEN과 사용방법은 동일하다.

-- 중간고사 성적에 따라 GRADE_A 테이블과 GRADE_B 테이블에 삽입
INSERT FIRST
WHEN SCORE > 80 THEN
	INTO GRADE_A VALUES(NAME, SCORE)
WHEN SCORE > 40 THEN
	INTO GRADE_B VALUES(NAME, SCORE)
SELECT * FROM MID_EXAM;

📁 UPDATE

테이블에 기록된 컬럼 값을 수정하는 구문

UPDATE 테이블명
SET 컬럼명=수정할 값
WHERE 수정할 행의 조건;

 

한번에 여러 행을 수정할 수도 있다.

UPDATE EMP_SALARY
SET (SALARY, BONUS) =
	(SELECT SALARY, BONUS FROM EMP_SALARY
	WHERE EMP_NAME IN ('유재식'))
WHERE EMP_NAME IN ('노옹철', '전형돈', '정중하', '하동운');

📁 DELETE

테이블에서 행을 삭제하는 구문

DELETE FROM 테이블명
WHERE 삭제할 행의 조건;

제약조건 비활성화

제약조건은 데이터의 무결성을 보장해 데이터의 무단 삽입, 삭제를 막는다.

그러나 제약조건에도 불구하고 데이터를 삭제해야 하는 경우가 생기는데, 잠시 제약조건을 비활성화함으로써 이를 가능하게 할 수 있다.

DISABLE CONSTRAINT

제약조건을 비활성화하는 예약어

ALTER TABLE 테이블명
DISABLE CONSTRAINT 제약조건명;

ENABLE CONSTRAINT

제약조건을 활성화하는 예약어

ALTER TABLE 테이블명
ENABLE CONSTRAINT 제약조건명;

CASCADE

만약 부모 테이블의 PK가 자식 테이블의 FK로 사용되고 있을 경우 DISABLE이 불가능하다.

CASCADE는 부모 테이블의 제약조건을 삭제하면 자식 테이블의 제약조건도 삭제해준다.

ALTER TABLE 테이블명
DISABLE CONSTRAINT 제약조건명 CASCADE;

 

MEMBER 테이블에서 아이디가 'xx'인 행을 삭제하는 경우를 보자.

이 때 MEMBER의 ID 컬럼을 BOARD의 WRITER 컬럼이 참조하고 있다.

-- MEMBER 테이블에서 아이디가 'xx'인 행을 삭제하는 경우

-- 1. MEMBER의 PK 제약조건 비활성화, DEBATE의 FK도 자동 비활성화
ALTER TABLE MEMBER
DISABLE CONSTRAINT MEMBER_PK CASCADE;

-- 2. BOARD에서 부서코드가 D8인 행 삭제
DELETE FROM MEMBER
WHERE ID='XX';

-- 3. BOARD에서 아이디가 'xx'인 행 삭제
DELETE FROM BOARD
WHERE WRITER='xx';

-- 4. MEMBER의 PK 제약조건 활성화
ALTER TABLE MEMBER
ENABLE CONSTRAINT MEMBER_PK;

-- 4. BOARD의 FK 제약조건 활성화
ALTER TABLE BOARD
ENABLE CONSTRAINT BOARD_FK;