메인 콘텐츠로 건너뛰기

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가 결과를 보는 방법입니다.

예제

  1. 행 추가

Query OK와 1 row affected가 보고의 전부입니다. 무엇이 들어갔는지 보려면 테이블을 요청하세요.
문은 4개의 열을 지정했고 행에는 6개가 있습니다. member_id는 열이 AUTO_INCREMENT라서 스스로 수를 올렸고, active는 테이블이 선언한 DEFAULT 1을 받았습니다.

  1. 서버가 고른 id 읽어 오기

AUTO_INCREMENT 값은 삽입 중에 결정되므로, 그 값을 아는 유일한 방법은 물어보는 것입니다. 삽입을 한 같은 세션에서 물어보세요.
LAST_INSERT_ID()는 내 연결에 대해서만 답하므로, 바쁜 서버가 다른 세션의 id를 건네줄 수 없습니다. 새 연결은 줄 답이 없어서 0을 반환합니다.

ERROR 1062는 행이 이미 있다는 뜻입니다

UNIQUE 열은 이미 가진 값을 실은 두 번째 행을 거부합니다. 여기서는 email이 유일하고, Mary Smith의 주소는 이미 사용 중입니다.
메시지는 값과 그것을 거부한 인덱스를 지목하는데, 보통 그것으로 진짜 중복인지, 유일하게 만들려다 그러지 못한 열인지 구분하기에 충분합니다. Upsert는 이 상황을 예상하고 대신 기존 행을 갱신하는 문입니다.

ERROR 1364는 필수 열이 빠졌다는 뜻입니다

NOT NULL이고 기본값이 없는 열을 생략하면, 서버는 쓸 것이 없습니다.
한 번에 열 1개를 지목하므로, 3개가 빠진 문은 3번 시도해야 합니다. DESCRIBE member;로 테이블을 읽고, Null 아래 NO로 표시되고 기본값이 없는 것을 모두 제공하세요. NULL을 허용하는 열은 다른 경우입니다. 생략하면 행에 NULL이 들어갑니다.

중복 키도 id를 하나 소비합니다

지금 id를 요청하면 6이 빠져 있습니다.
중복 키 시도는 실패하기 전에 6을 가져갔고, InnoDB는 번호를 돌려주지 않습니다. ERROR 1364 시도는 테이블에 닿기 전에 거부되었으므로 아무것도 가져가지 않았습니다. 이런 빈틈은 정상이고 아무것도 잃지 않았다는 뜻입니다. 이 열은 식별자로 다루고, 행의 개수로도, 번호가 끊김 없이 이어진다는 약속으로도 결코 다루지 마세요.

요약

  • 행을 추가하려면 INSERT INTO table (columns) VALUES (values)를 쓰세요.
  • 행 자체가 아니라 쓴 행의 수가 돌아옵니다.
  • 기본값이나 AUTO_INCREMENT가 있는 열은 생략하고 서버가 채우게 하세요.
  • ERROR 1062는 UNIQUE 열이 이미 가진 값이라는 뜻으로 읽으세요.
  • ERROR 1364는 제공하지 않은 필수 열이라는 뜻으로 읽으세요.
  • 중복 키 실패는 번호를 그대로 소비하므로, AUTO_INCREMENT 열에는 빈틈이 생깁니다.

함께 보기

  • 여러 행 삽입 — 문 1개, 여러 행
  • INSERT SELECT — 직접 입력하는 대신 쿼리에서 가져온 행
  • Upsert — 삽입하거나, 길을 막는 행을 갱신하기
  • UPDATE — 이미 있는 행 바꾸기