13.2.5 INSERT 구문
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
,...)] [(col_name
,...)] {VALUES | VALUE} ({expr
| DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATEcol_name
=expr
[,col_name
=expr
] ... ]
또는 :
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
...) SETcol_name
= {expr
| DEFAULT}, ... [ON DUPLICATE KEY UPDATEcol_name
=expr
[,col_name
=expr
] ...]
또는 :
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
...) [(col_name
, ...)] SELECT ... [ON DUPLICATE KEY UPDATEcol_name
=expr
[,col_name
=expr
] ...]
INSERT
기존 테이블에 새로운 행을 삽입합니다. 이 문 INSERT ... VALUES
과 INSERT ... SET
형식은 명시 적으로 지정된 값에 따라 행을 삽입합니다. INSERT ... SELECT
형식은 다른 하나 이상의 테이블에서 선택된 행을 삽입합니다. INSERT ... SELECT
내용은 섹션 13.2.5.1 "INSERT ... SELECT 구문" 부분에 자세히 설명되어 있습니다.
MySQL 5.6.2 이후에서는 파티션 된 테이블에 삽입 할 때 어떤 파티션 및 하위 파티션이 새 행을 받아 들일지를 제어 할 수 있습니다. PARTITION
옵션은 테이블의 하나 이상의 파티션 또는 서브 파티션 (또는 둘 다)의 이름의 쉼표로 구분 된 목록을받습니다. 특정 INSERT
문에 의해 삽입 된 행을 나열하는 하나의 파티션과 일치하지 않으면 INSERT
문은 Found a row not matching the given partition set 오류로 실패합니다. 자세한 내용 및 예제는 섹션 19.5 "파티션 선택" 을 참조하십시오.
오래된 행을 덮어하려면 INSERT
대신에 REPLACE
를 사용할 수 있습니다. REPLACE
는 기존 행을 복제하는 고유 키 값을 갖는 새 행의 처리에서 INSERT IGNORE
에 해당하는 것입니다. 새로운 라인은 파기되는 것이 아니라 기존 행을 대체하는 데 사용됩니다. 섹션 13.2.8 "REPLACE 구문" 을 참조하십시오.
tbl_name
은 행이 삽입되는 테이블입니다. 이 문에서 값이 제공되는 컬럼은 다음과 같이 지정할 수 있습니다.
테이블 이름 다음에 컬럼 이름의 쉼표로 구분 된 목록을 지정할 수 있습니다. 이 경우 지정된 각 컬럼의 값을
VALUES
목록 또는SELECT
문에서 지정해야합니다.INSERT ... VALUES
또는INSERT ... SELECT
에 열 이름 목록을 지정하지 않으면 테이블의 모든 컬럼의 값을VALUES
목록 또는SELECT
문에서 지정해야합니다. 테이블 내의 컬럼의 순서를 모르는 경우DESCRIBE
을 사용하여 찾습니다.tbl_name
SET
절은 컬럼 이름을 명시 적으로 보여줍니다.
컬럼 값은 다음의 몇 가지 방법으로 지정할 수 있습니다.
엄격한 SQL 모드에서 실행하지 않으면 값이 명시 적으로 지정되지 않은 컬럼은 모든 기본 (명시 적 또는 암시 적) 값으로 설정됩니다. 예를 들어, 테이블의 모든 컬럼을 지정하지 않은 컬럼리스트를 지정하면, 지정된 않은 열은 기본값으로 설정됩니다. 기본값 할당 내용은 섹션 11.6 "데이터 유형 기본값" 으로 설명되어 있습니다. 섹션 1.8.3.3 "잘못된 데이터 제한" 을 참조하십시오.
기본값이 포함되지 않은 모든 컬럼의 값을 명시 적으로 지정하지 않으면
INSERT
문에 오류가 생성되도록하려면 엄격 모드를 사용하도록하십시오. 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.컬럼을 명시 적으로 기본값으로 설정하려면 키워드
DEFAULT
를 사용합니다. 이렇게하면 테이블의 각 컬럼의 값이 포함되지 않은 불완전한VALUES
목록을 쓰지 않아도되기 때문에 일부 컬럼을 제외한 모든 컬럼에 값을 할당INSERT
문 작성이 쉬워집니다 . 그렇지 않은 경우는VALUES
목록의 각 값에 대응하는 컬럼 이름의 목록을 작성해야합니다.또한 특정 컬럼의 디폴트 값을 생성하는 식으로 사용할 수있는보다 일반적인 형태로
DEFAULT(
를 사용할 수 있습니다.col_name
)컬럼리스트와
VALUES
목록이 모두 비어있는 경우INSERT
는 각 컬럼을 기본 값으로 설정된 행을 만듭니다.INSERT INTO
tbl_name
() VALUES ();엄격 모드에서는 하나의 컬럼에 기본값이 포함되어 있지 않으면 오류가 발생합니다. 그렇지 않으면, MySQL은 명시 적으로 정의 된 기본값이 포함되지 않은 모든 컬럼에 대해서 암시 적 기본값을 사용합니다.
수식
expr
을 지정하여 컬럼 값을 지정할 수 있습니다. 여기에는 식의 형식이 컬럼의 형태에 일치하지 않는 경우 형식 변환이 이뤄질 가능성이 있고, 특정 값의 변환은 데이터 유형에 따라 다른 값이 삽입 될 수 있습니다. 예를 들어, 문자열'1999.0e-2'
를INT
,FLOAT
,DECIMAL(10,6)
또는YEAR
컬럼에 삽입하면 각 값1999
,19.9921
,19.992100
및1999
이 삽입됩니다.INT
와YEAR
컬럼에 저장되는 값이1999
인 이유는 문자열에서 정수로 변환은 문자열의 첫번째 유효한 정수 또는 년으로 간주 될 수있는 부분 만 조사 할 수 있기 때문입니다. 부동 소수점 및 고정 소수점 컬럼의 경우 문자열에서 부동 소수점으로 변환에서는 전체 문자열을 유효한 부동 소수점 값으로 간주합니다.수식
expr
는 이전에 값 목록에 설정된 임의의 컬럼을 참조 할 수 있습니다. 예를 들어, 다음 명령문은col2
의 값이 이전에 할당 된col1
을 참조하고 있기 때문에 실행 가능합니다.INSERT INTO
tbl_name
(col1, col2) VALUES (15, col1 * 2);그러나 다음 문은
col1
의 값이col1
다음에 할당 된col2
를 참조하고 있기 때문에 정당하지 않습니다.INSERT INTO
tbl_name
(col1, col2) VALUES (col2 * 2,15);하나의 예외는
AUTO_INCREMENT
값을 포함 열 수 있습니다.AUTO_INCREMENT
값은 다른 값 할당 후 생성하여 할당의AUTO_INCREMENT
컬럼에 대한 참조는 모두0
을 반환합니다.
VALUES
구문을 사용하는 INSERT
문은 여러 행을 삽입 할 수 있습니다. 이렇게에는 각각 괄호 안에 쉼표로 구분 된 컬럼 값의 여러 목록을 포함합니다. 예 :
INSERT INTO tbl_name
(a, b, c) VALUES (1,2,3) (4,5,6) (7,8,9);
각 행의 값 목록은 괄호로 둘러싸여 있어야합니다. 다음 문은 목록에서 값의 수가 컬럼 이름의 수와 일치하지 않기 때문에 잘못되었습니다.
INSERT INTO tbl_name
(a, b, c) VALUES (1,2,3,4,5,6,7,8,9);
이러한 맥락에서, VALUE
는 VALUES
의 동의어입니다. 모두 값 목록의 숫자에 대해 아무것도 표시하지 않고, 값 목록이 하나의 경우에도 여러 경우에도 사용할 수 있습니다.
INSERT
관해서는 영향을받은 행의 값은 ROW_COUNT()
함수 ( 섹션 12.14 "정보 함수" 를 참조하십시오) 또는 mysql_affected_rows()
C API 함수 ( 섹션 23.8.7.1 "mysql_affected_rows ()" 를 참조하십시오 )를 사용하여 얻을 수 있습니다.
INSERT ... VALUES
문을 여러 값 목록 또는 INSERT ... SELECT
와 함께 사용하는 경우이 문은 다음과 같은 형식의 정보 문자열을 반환합니다.
Records : 100 Duplicates : 0 Warnings : 0
Records
는이 명령문이 처리 된 행 수를 나타냅니다. (이는 Duplicates
가 0 이외 인 수 있으므로 반드시 실제로 삽입 된 행 수는 없습니다.) Duplicates
은 어떤 기존의 고유 인덱스 값을 복제하는 데 삽입 할 수없는 행 수 를 나타냅니다. Warnings
는 어떤 점에서 문제가 있었다 컬럼 값을 삽입하는 시도 횟수를 나타냅니다. 경고는 다음 조건 중 하나에서 발생할 수 있습니다.
NOT NULL
로 선언 된 컬럼에NULL
을 삽입. 여러 행INSERT
문 또는INSERT INTO ... SELECT
문의 경우,이 컬럼은 컬럼 데이터 유형의 암시 적 기본값으로 설정됩니다. 이것은 숫자 형은0
, 문자열은 빈 문자열 (''
), 날짜 및 시간 형식이 "0"의 값입니다. 서버는SELECT
의 결과 집합을 검사하여 그것이 단일 행을 반환 여부를 확인하지 않기 때문에INSERT INTO ... SELECT
문은 여러 줄의 삽입과 같은 방법으로 처리됩니다. (단일 행INSERT
의 경우,NULL
이NOT NULL
컬럼에 삽입되어 경고가 발생하지 않습니다. 대신이 문이 오류와 함께 실패합니다.)수치 컬럼, 컬럼의 범위를 벗어난 값에 설정. 이 값은 범위의 가장 가까운 끝점에 클립됩니다.
숫자 컬럼에
'10.34 a'
등의 값의 할당. 후속 숫자가 아닌 텍스트는 제거되고 나머지 숫자 부분이 삽입됩니다. 문자열 값에 선두의 수치 부분이 포함되지 않은 경우,이 컬럼은0
으로 설정됩니다.문자열 컬럼 (
CHAR
,VARCHAR
,TEXT
또는BLOB
)에 그 컬럼의 최대 길이를 초과하는 문자열 삽입. 이 값은 컬럼의 최대 길이로 자릅니다.날짜 또는 시간 컬럼에 해당 데이터 유형으로서 부정한 값의 삽입. 이 컬럼은 그 형태에 적절한 0의 값으로 설정됩니다.
C API를 사용하는 경우, mysql_info()
함수를 호출하여 정보 문자열을 얻을 수 있습니다. 섹션 23.8.7.35 "mysql_info ()" 를 참조하십시오.
INSERT
에서 AUTO_INCREMENT
컬럼을 포함하는 테이블에 행을 삽입 한 경우, 그 컬럼에 사용 된 값은 SQL의 LAST_INSERT_ID()
함수를 사용하여 검색 할 수 있습니다. C API 내에서, mysql_insert_id()
함수를 사용합니다.
이러한 두 가지 기능이 반드시 동일한 동작을 수행하지는 않습니다. AUTO_INCREMENT
컬럼에 관련한 INSERT
문 동작 내용은 섹션 12.14 "정보 함수" 및 섹션 23.8.7.37 "mysql_insert_id ()" 부분에 자세히 설명되어 있습니다.
INSERT
문은 다음 수정 지원합니다.
DELAYED
키워드를 사용하면 삽입되는 하나 이상의 행을 서버가 버퍼에 배치하기 위해INSERT DELAYED
명령문을 발행하는 클라이언트는 즉시 계속할 수 있습니다. 테이블이 사용중인 경우, 서버는 해당 행을 유지합니다. 테이블이 사용되지 않는 경우 서버는 행의 삽입을 개시하는 한편, 그 테이블에 대한 새로운 읽기 요청이 있는지 여부를 정기적으로 확인합니다. 존재하는 경우 해당 테이블을 다시 사용하지 않는 때까지 지연되는 행의 큐는 중단됩니다. 섹션 13.2.5.2 "INSERT DELAYED 구문" 을 참조하십시오.DELAYED
는INSERT ... SELECT
또는INSERT ... ON DUPLICATE KEY UPDATE
는 무시됩니다.DELAYED
는 또한 테이블과 트리거에 액세스하는 함수를 사용하고 있는지, 또는 함수 나 트리거에서 호출 된INSERT
에도 무시됩니다.참고MySQL 5.6.6 현재
INSERT DELAYED
는 사용되지 않으며 이후 릴리스에서 제거됩니다. 대신INSERT
(DELAYED
를 붙이지 않는)을 사용하십시오.LOW_PRIORITY
키워드를 사용하면INSERT
의 실행은 다른 어떤 클라이언트도 테이블에서 읽은 않을 때까지 지연됩니다. 여기에는 기존의 클라이언트 읽는 동안 나INSERT LOW_PRIORITY
문이 기다리는 동안 읽기를 시작한 다른 클라이언트가 포함됩니다. 따라서 읽기 부하가 높은 환경에서는INSERT LOW_PRIORITY
스테이트먼트를 발행 한 클라이언트가 매우 긴 시간 (경우에 따라서는 무기한) 대기하게 될 수 있습니다. (이것은 클라이언트를 즉시 계속할 수 있도록하는INSERT DELAYED
와 대조적입니다.)MyISAM
테이블에서LOW_PRIORITY
를 사용하면 병렬 삽입이 무효가되기 때문에 일반적으로 그렇지 않도록하십시오. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.HIGH_PRIORITY
를 지정하면 서버가--low-priority-updates
옵션으로 시작되는 경우에 그 효과가 무시됩니다. 또한 동시 삽입도 사용되지 않습니다. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.LOW_PRIORITY
과HIGH_PRIORITY
는 테이블 수준의 잠금만을 사용하는 스토리지 엔진 (MyISAM
,MEMORY
,MERGE
등)에만 영향을 미칩니다.IGNORE
키워드를 사용하면INSERT
문을 실행하는 동안 발생한 오류는 무시됩니다. 예를 들어,IGNORE
를 사용하지 않을 경우 테이블의 기존UNIQUE
인덱스 나PRIMARY KEY
값을 복제 할 줄은 중복 키 오류가 발생하여이 문은 중단됩니다.IGNORE
를 지정하면 해당 행이 삭제되고 오류가 발생하지 않습니다. 대신 무시 된 오류가 경고를 생성 할 수 있지만 중복 키 오류를 생성하지 않습니다.IGNORE
는 특정 값에 일치하는 파티션을 찾을 분할 된 테이블에 삽입에서도 같은 효과가 있습니다.IGNORE
를 지정하지 않으면이 같은INSERT
문은 에러로 중지됩니다. 그러나INSERT IGNORE
가 사용되는 경우 일치하지 않는 값을 포함한 행 삽입 작업이 암시 적으로 실패 만 일치하는 행은 삽입됩니다. 예를 들어, 섹션 19.2.2 "LIST 파티셔닝" 를 참조하십시오.IGNORE
가 지정되어 있지 않으면 오류를 트리거하는 데이터 변환에 의해 문이 중지됩니다.IGNORE
를 지정하면 잘못된 값은 가장 가까운 값으로 조정되어 삽입됩니다. 경고가 생성되지만 문은 중단되지 않습니다.mysql_info()
C API 함수를 사용하면 테이블에 실제로 삽입 된 행 수를 확인할 수 있습니다.ON DUPLICATE KEY UPDATE
를 지정했을 때,UNIQUE
인덱스 나PRIMARY KEY
에 중복 된 값을 발생시키는 행이 삽입 된 경우, 이전 행의UPDATE
가 실행됩니다. 각 행의 영향을받은 행의 값은 행이 새로운 행으로 삽입 된 경우는 1 기존의 행이 갱신 된 경우 2 기존 행이 현재 값에 설정 된 경우 0입니다. mysqld에 연결할 때CLIENT_FOUND_ROWS
플래그를mysql_real_connect()
에 지정하면 기존 행을 현재 값으로 설정되었을 경우의 영향을받은 행의 값은 (0이 아닌) 1입니다. 섹션 13.2.5.3 "INSERT ... ON DUPLICATE KEY UPDATE 구문" 을 참조하십시오.
테이블에 삽입하려면 그 테이블에 대한 INSERT
권한이 필요합니다. ON DUPLICATE KEY UPDATE
절이 사용되어 중복 키 위해 대신 UPDATE
가 실행되는 경우,이 문은 업데이트되는 컬럼에 대한 UPDATE
권한이 필요합니다. 읽을 만 변경되지 않는 열의 경우 SELECT
권한 만 필요합니다 ( ON DUPLICATE KEY UPDATE
절에있는 col_name
= expr
할당의 오른쪽에서만 참조되는 컬럼의 경우 등).
MySQL 5.6.6 이전에는 테이블 수준의 잠금을 채용 한 MyISAM
등의 스토리지 엔진을 사용하는 파티션 된 테이블에 영향을주는 INSERT
의해 그 테이블의 모든 파티션이 잠겨있었습니다. 이것은 INSERT ... PARTITION
문에도 적용되었습니다. (이것은 행 레벨 락을 채용 한 InnoDB
등의 스토리지 엔진에서 발생하지 않았고 현재도 발생하지 않습니다.) MySQL 5.6.6 이후에서는, MySQL은 파티션 잠금 가지 치기를 사용합니다. 따라서 행이 삽입되는 파티션 만 실제로 잠기도록합니다. 자세한 내용은 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.