Programing

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

lottogame 2020. 5. 15. 07:58
반응형

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


단일 쿼리에 여러 행을 삽입하려는 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

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


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),
     ...

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);

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

참고 : https://stackoverflow.com/questions/2714587/mysql-on-duplicate-key-update-for-multiple-rows-insert-in-single-query

반응형