단일 쿼리에서 여러 행 삽입을위한 MySQL ON DUPLICATE KEY UPDATE


199

단일 쿼리에 여러 행을 삽입하려는 SQL 쿼리가 있습니다. 그래서 나는 다음과 같은 것을 사용했다 :

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

문제는이 쿼리를 실행할 때 위와 같은 UNIQUE키 ( PRIMARY KEY예 : 가 아닌 ) 를 확인 해야하는지 'name'확인하고 'name'이미 존재하는 경우 해당 전체 행을 다르게 삽입하여 업데이트해야한다는 것입니다.

예를 들어, 아래 예 'Katrina'에서 데이터베이스에 이미있는 경우 필드 수에 관계없이 전체 행을 업데이트해야합니다. 다시 'Samia'나타나지 않으면 행을 삽입해야합니다.

나는 다음을 사용하려고 생각했다.

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

함정입니다. 진행 방법에 대해 혼란스러워했습니다. 한 번에 여러 행을 삽입 / 업데이트 할 수 있습니다. 방향을 알려주십시오. 감사.

답변:


479

VALUES새로운 값을 참조 하려면 키워드 를 사용 하십시오 ( 문서 참조 ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
각 행마다 조건이 다른 UPDATE에 IF 문을 포함시켜야하는 경우 어떻게해야합니까?
논리

2
@logic : 이와 관련된 몇 가지 질문이 있습니다 : StackOverflow search . 그들 중 누구도 귀하의 질문에 대답하지 않으면, 당신이 필요로하는 것을 정확하게 설명하는 새로운 질문을 게시하십시오.
Peter Lang

@ logic 문제에 대한 해결책을 찾았습니까? 현재 나는 같은 문제에 직면 해있다
Parth kharecha

좋은 제안. 복제 할 때 값을 늘리려면 "중복 키 업데이트"부분 다음에이 값을 추가하십시오. total = total + VALUES (total)
피닉스

1

INSERT INTO ... ON 중복 키 업데이트는 SQL Server가 아닌 MYSQL에 대해서만 작동합니다.

SQL Server의 경우이 문제를 해결하는 방법은 먼저 임시 테이블을 선언하고 해당 임시 테이블에 값을 삽입 한 다음 MERGE를 사용하는 것입니다.

이처럼 :

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
SQL 서버를 사용하는 사람 : D
Jeremy Belolo

-3

INSERT ... ON DUPLICATE KEY UPDATE 대신 Replace 를 사용할 수 있습니다 .


28
예. 그러나 REPLACE를 사용하면 새 행이 삽입되기 전에 이전 행이 삭제됩니다. 기본 ID를 유지하기 위해 이전 행을 유지하고 싶습니다.
Prashant

2
나는 오래된 PK를 유지하는 것이 어떻게 든 당신에게 중요하다는 것을 몰랐다 ... 확실히,이 경우 REPLACE가 작동하지 않을 것입니다 ...
a1ex07

4
PS : "바꾸기"에는 삭제 및 삽입 권한이 모두 필요합니다!
Oliver M Grech

2
위에서 언급 한 삭제 / 삽입 이유로 인해 이러한 경우에도 훨씬 느려집니다.
Ross

1
몇 개의 열을 업데이트하려면 어떻게합니까? 바꾸기가 모두 업데이트됩니다.
imVJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.