VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
INSERT는 데이터를 씁니다. 여기서부터는 문이 테이블의 내용을 바꾸므로, 튜토리얼의 나머지는 샘플 데이터가 아니라 별도의 데이터베이스에서 작업합니다.
연습용 데이터베이스
Sakila는 모든 읽기 수업이 설명하는 기준이므로, 그대로 두세요. 대신 그 옆에 작은 데이터베이스를 만들고, 처음부터 다시 시작하고 싶을 때마다 이것을 다시 실행하세요.mysql -u root -p sakila_practice로 클라이언트를 열고, 수업 사이에 이 블록을 다시 실행하세요.
INSERT의 동작 방식
TABLE_NAME을 쓰기 대상 테이블로, COLUMN_LIST를 값을 제공할 열로, VALUE_LIST를 그 열마다 1개씩의 값으로 같은 순서로 바꾸세요.
서버는 행을 추가하고 몇 개를 썼는지 보고합니다. 행을 돌려주지는 않으므로, 그 뒤의 SELECT가 결과를 보는 방법입니다.
예제
- 행 추가
Query OK와 1 row affected가 보고의 전부입니다. 무엇이 들어갔는지 보려면 테이블을 요청하세요.
member_id는 열이 AUTO_INCREMENT라서 스스로 수를 올렸고, active는 테이블이 선언한 DEFAULT 1을 받았습니다.
- 서버가 고른 id 읽어 오기
AUTO_INCREMENT 값은 삽입 중에 결정되므로, 그 값을 아는 유일한 방법은 물어보는 것입니다. 삽입을 한 같은 세션에서 물어보세요.
LAST_INSERT_ID()는 내 연결에 대해서만 답하므로, 바쁜 서버가 다른 세션의 id를 건네줄 수 없습니다. 새 연결은 줄 답이 없어서 0을 반환합니다.
ERROR 1062는 행이 이미 있다는 뜻입니다
UNIQUE 열은 이미 가진 값을 실은 두 번째 행을 거부합니다. 여기서는 email이 유일하고, Mary Smith의 주소는 이미 사용 중입니다.
ERROR 1364는 필수 열이 빠졌다는 뜻입니다
NOT NULL이고 기본값이 없는 열을 생략하면, 서버는 쓸 것이 없습니다.
DESCRIBE member;로 테이블을 읽고, Null 아래 NO로 표시되고 기본값이 없는 것을 모두 제공하세요.
NULL을 허용하는 열은 다른 경우입니다. 생략하면 행에 NULL이 들어갑니다.
중복 키도 id를 하나 소비합니다
지금 id를 요청하면 6이 빠져 있습니다.ERROR 1364 시도는 테이블에 닿기 전에 거부되었으므로 아무것도 가져가지 않았습니다. 이런 빈틈은 정상이고 아무것도 잃지 않았다는 뜻입니다. 이 열은 식별자로 다루고, 행의 개수로도, 번호가 끊김 없이 이어진다는 약속으로도 결코 다루지 마세요.
요약
- 행을 추가하려면
INSERT INTO table (columns) VALUES (values)를 쓰세요. - 행 자체가 아니라 쓴 행의 수가 돌아옵니다.
- 기본값이나
AUTO_INCREMENT가 있는 열은 생략하고 서버가 채우게 하세요. ERROR 1062는UNIQUE열이 이미 가진 값이라는 뜻으로 읽으세요.ERROR 1364는 제공하지 않은 필수 열이라는 뜻으로 읽으세요.- 중복 키 실패는 번호를 그대로 소비하므로,
AUTO_INCREMENT열에는 빈틈이 생깁니다.
함께 보기
- 여러 행 삽입 — 문 1개, 여러 행
- INSERT SELECT — 직접 입력하는 대신 쿼리에서 가져온 행
- Upsert — 삽입하거나, 길을 막는 행을 갱신하기
- UPDATE — 이미 있는 행 바꾸기