MySQL INSERT INTO 테이블 VALUES .. vs. INSERT INTO 테이블 SET


252

간의 주요 차이점은 무엇입니까 INSERT INTO table VALUES ..와는 INSERT INTO table SET?

예:

INSERT INTO table (a, b, c) VALUES (1,2,3)

INSERT INTO table SET a=1, b=2, c=3

그리고이 두 가지의 성능은 어떻습니까?


12
Code Complete와 McConnell의 가독성에 대한 끊임없는 강조를 읽은 후에 INSERT INTO table SET는 표준이 아닌 것은 불행한 것 같습니다 . 훨씬 더 명확 해 보입니다. INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])Postgres로 이식하면 문제를 피하기 위해 어쨌든 구문 을 사용해야 할 것 같습니다 .
cluelesscoder

답변:


195

내가 알 수있는 한 두 구문은 동일합니다. 첫 번째는 SQL 표준이고 두 번째는 MySQL의 확장입니다.

따라서 그것들은 정확히 현명한 성능이어야합니다.

http://dev.mysql.com/doc/refman/5.6/en/insert.html 은 다음과 같이 말합니다.

INSERT는 기존 테이블에 새 행을 삽입합니다. 명령문의 INSERT ... VALUES 및 INSERT ... SET 양식은 명시 적으로 지정된 값을 기반으로 행을 삽입합니다. INSERT ... SELECT 양식은 다른 테이블에서 선택된 행을 삽입합니다.


4
INSERT INTO table SET?를 사용하여 여러 값을 어떻게 삽입 합니까? 이것도 가능합니까?
pixelfreak

2
무슨 소리 야? OP의 예에는 SET a = 1, b = 2, c = 3이라고 표시되어 있습니다.
Vinko Vrsalovic 2018 년

9
나는 여러 행을 삽입했다. INSERT INTO 테이블 (a, b, c) 값 (1,2,3), (4,5,6), (7,8,9);
pixelfreak

5
VALUES 구문을 사용하는 INSERT 문만 여러 행을 삽입 할 수 있습니다.
Vinko Vrsalovic 2018 년

8
@VinkoVrsalovic, 사실이 아님, 삽입 선택은 여러 행을 선택한 경우에도 여러 행을 삽입 할 수 있습니다
Pacerier

15

확장 기능은 삽입 및 업데이트에 비슷한 구문을 허용하기위한 것입니다. Oracle에서 유사한 구문 적 트릭은 다음과 같습니다.

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)

5
@Pacerier와 같은? 내가 볼 수있는 유일한 문제는 이식성 문제입니다 (많은 맥락에서 실제로 중요하지 않습니다). 뭔가 빠졌습니까?
Mark Amery

1
@MarkAmery, 네, 그것을 볼 때 실제 이점은 없습니다. 단점은 불필요한 시간이 낭비 된다는 것입니다.이 스레드의 존재가 내 요점을 입증합니다.
Pacerier

8
@Pacerier 나는 당신의 요점이 보이지 않을까요? 몇 시간을 낭비 했습니까? 이미 지적한 이점이 있습니다. VALUES 구문을 사용해야 할 때보 다 INSERT 문을 작성하기 위해 INSERT 문을 작성하기 위해 키 / 값 쌍 배열을 한 번만 반복하면되므로 짧고 명확합니다. 보다 빠른 코드 작성.
Mark Amery

@MarkAmery하지만 오라클 트릭은하지 않습니다 그 혜택을. 모든 열의 이름을 먼저 지정한 다음 모든 값의 이름을 지정하십시오.
hobbs

12
@Pacerier 그것은 공정한 포인트이며, 측정해야 할 절충점이 있습니다. 이 기능에 대해 당신은 이동성 문제와 시간의 차이 연구 낭비가 INSERT ... SET ...INSERT ... VALUES .... 이 기능의 경우 코드 작성 시간이 짧고 작성 속도가 빠르고 가독성이 향상되며 VALUES절을 작성할 때 열 순서를 혼합하여 오타가 제거됩니다 . 내 직감은 그물에서 선이 선을 능가한다고 말하지만 판단이 다를 수 있습니다.
Mark Amery

4

구문은 (어쨌든 MySQL에서는) 동일하기 때문에 구문을 선호합니다 INSERT INTO table SET x=1, y=2. 특히 많은 열을 삽입 할 때 명령문에서 수정하기 쉽고 오류를 잡기가 더 쉽기 때문입니다. 10 또는 15 개 이상의 열을 삽입 해야하는 경우 (x, y) VALUES (1,2)내 의견으로 는 구문 을 사용하여 무언가를 혼합하는 것이 정말 쉽습니다 .

다른 SQL 표준 간의 이식성이 문제인 INSERT INTO table (x, y) VALUES (1,2)경우 선호 될 수 있습니다.

단일 쿼리에 여러 레코드를 삽입하려는 경우 INSERT INTO ... SET구문이 작동 하는 것처럼 보이지만 다른 레코드 는 작동 하지 않습니다 . 그러나 대부분의 실제 경우에는 레코드 세트를 반복하여 삽입을 수행합니다.하지만 하나의 큰 쿼리를 구성하여 한 행의 테이블에 여러 행을 삽입하여 하나의 쿼리에 대한 쿼리를 생성하는 경우가 있습니다. 각 행의 성능이 향상 될 수 있습니다. 정말 몰라

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.