반응형
데이터베이스를 사용할 때 가장 많이 사용하게 되는 DML 문에 대해서
하나씩 정리해보려고 합니다.
우선 가장 기본적으로 테이블에 데이터가 있어야 뭐든 가능하므로
데이터를 입력하는 INSERT 구문에 대해서 알아봅시다!
•INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [IGNORE]
[INTO] tbl_name [(col_name, …)]
VALUES ({expr | DEFAULT}, …), (…),…
[ ON DUPLICATE KEY UPDATE col_name = expr, …. ]
•INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, …
[ ON DUPLICATE KEY UPDATE col_name = expr, …. ]
•INSERT [LOW_PRIORITY | HIGH_PRIORITY ] [IGNORE]
[INTO] tbl_name [(col_name, …)]
SELECT …
[ ON DUPLICATE KEY UPDATE col_name = expr, …. ](구문에 대한 참조는 MySQL Reference로부터 합니다.)
구문에서 [ ] 로 나타난 부분은 생략이 가능하다는 뜻입니다.
{ } 의 경우는 반드시 입력해야 한다는 뜻입니다.
기본적인 구문은 INSERT INTO 테이블명 (컬럼명, 컬럼명, ... ) values (값, 값, ...) 인데
이 외의 내용에 대해서 하나씩 설명하면
1) LOW_PRIORITY : 다른 클라이언트들이 해당 테이블에 대해서 읽지 않을 때까지 대기하는 최하위 순위로 명령실행
2) DELAYED : 사용되고 있는 테이블에 대해서
삽입할 명령을 수행하여 레코드 목록을 가지고 있지만 일단 queue에 넣어두었다가,
테이블에 대한 사용이 끝난 뒤에 명령을 시행하도록 하는 속성
3) HIGH_PRIORITY : 가장 우선적으로 하여 다른 명령에 의한 동시적인
삽입을 불가하게 함
4) IGNORE : 중복되어 키 위반을 일으키는
레코드를 무시
5) ON DUPLICATE KEY UPDATE :
UNIQUE 또는 PRIMARY KEY에 중복값을 가진 레코드를 삽입하는 명령을 실행했을 경우
중복되는 명령에 대한 실행 대신 UPDATE문을 사용하게 하는 속성이다. (DELAYED 속성은 무시된다)
ON DUPLICATE KEY UPDATE에 대해서는 예시가 필요하겠네요.
첨부한 이미지를 보시면 윗 부분에서 SELECT 문으로 t1 테이블에 있는 데이터를 가져옵니다.
(t1 테이블은 id가 int, PRIMARY KEY (PK) 인 테이블입니다.)
이 내용에 대해서 그 아래에 있는 INSERT 구문에서 이미 존재하는 1이라는 데이터를 또 삽입하고 있습니다.
따라서 중복되는 내용이므로 IGNORE가 없다면
ON DUPLICATE KEY UPDATE에 있는 내용을 반영하게 됩니다.
원래의 명령인 id = 1, s1 = 32 라는 값을 삽입하지 않고,
기존 테이블의 id = 1의 값을 이용하여, s1의 값을 기존 s1 값에 4를 더해준 값으로 변경하는 명령을 시행합니다.
따라서 이 명령 후의 결과값인 맨 마지막 명령의 수행 결과는
기존 (1, 10) ===============> 변경 (1, 14) 가 됩니다.
이 내용에 대해서 그 아래에 있는 INSERT 구문에서 이미 존재하는 1이라는 데이터를 또 삽입하고 있습니다.
따라서 중복되는 내용이므로 IGNORE가 없다면
ON DUPLICATE KEY UPDATE에 있는 내용을 반영하게 됩니다.
원래의 명령인 id = 1, s1 = 32 라는 값을 삽입하지 않고,
기존 테이블의 id = 1의 값을 이용하여, s1의 값을 기존 s1 값에 4를 더해준 값으로 변경하는 명령을 시행합니다.
따라서 이 명령 후의 결과값인 맨 마지막 명령의 수행 결과는
기존 (1, 10) ===============> 변경 (1, 14) 가 됩니다.
만약 INSERT 대신 REPLACE를 사용한다면?
위의 경우에서 (1, 10) 이라는 기존값을 가지고 있는 경우
(1, 32) 라는 값으로 대체하고 싶을 때 REPLACE를 사용하여
REPLACE INTO t1 (id, s1) values (1, 32);
와 같이 명령을 수행하면, 기존의 내용을 입력한 값으로 대체할 수 있습니다.
위의 글 상자 안에 소개된 INSERT의 세가지 방법에 대해서 간략하게 설명한 후
그와 관련한 예제를 보시겠습니다.
1. INSERT INTO 테이블명 (컬럼명, 컬럼명, .... ) values (값, 값, ...)
가장 기본적으로 사용되는 구문으로 만약에 컬럼명에 대해서
입력하지 않는다면 컬럼 순서대로 값이 들어가는 형태입니다.
여기서 드리는 TIP 한가지 더
values (값, 값, 값), (값, 값, 값) 이렇게 이어서 쓰게 되면
컬럼과 해당되는 값끼리 맵핑되어서 INSERT 된답니다.
번거로울 수 있는 일을 줄일 수 있지요.
2. INSERT INTO 테이블명 SET 컬럼명 = 값
입력하고자 하는 값이 컬럼하나에 값 하나다! 이런 경우에는 지금의 방법이 적격이지요.
이외에도 여러가지로 쓰일 수 있다고 보여지는 구문입니다.
만약 입력하고자 하는 내용이 이미 다른 테이블에 있는 내용이라면
INSERT 구문에서 다른 테이블의 조회 결과를 사용하는 지금의 방법을 사용하시면 됩니다.
만약 컬럼의 수가 다르다면 SELECT 구문에서 넣고자하는 컬럼에 맞게
조절하셔서 조회해오셔야 합니다. 일치하지 않으면 에러가 나요!
제일 간단하지만 기본적이고 중요한 INSERT 문에 대해서 살펴보았습니다.
다음 DML문은 INSERT 한 내용에 대해서 조회하는 SELECT 문입니다.
SELECT 문을 잘 사용할 줄 알면 Query 짜는데 있어서 막강한 힘을 가졌다고 보여집니다.
여러번에 나눠서 소개하고자하는 기능을 써볼 예정입니다.
2011.07 오혜영 작성
반응형
'DataBase > MySQL, MariaDB' 카테고리의 다른 글
DB 전체에서 특정 필드를 찾아야 할 때 (0) | 2017.11.29 |
---|---|
SELECT JOIN 문을 이용한 UPDATE QUERY (0) | 2017.03.30 |
MySQL Storage Engine의 양대산맥! MyISAM vs InnoDB (3) | 2011.03.31 |
WHERE 절의 IN 사용법! (0) | 2011.02.08 |
Select와 동시에 Delete 하기. (0) | 2011.02.08 |