λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

MERGE INTO μ‚¬μš©λ²• 데이터가 있으면 UPDATE μ—†μœΌλ©΄ INSERT

by 5566 2023. 9. 28.

MERGE INTOλ₯Ό μ‚¬μš©ν•˜λŠ” κΈ€μ“°κΈ° 방법

MERGE INTO 문은 데이터가 있으면 UPDATEλ₯Ό μˆ˜ν–‰ν•˜κ³ , μ—†μœΌλ©΄ INSERTλ₯Ό μˆ˜ν–‰ν•˜λŠ” SQL κ΅¬λ¬Έμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ μ‰½κ²Œ μ—…λ°μ΄νŠΈν•˜κ³  μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έ κΈ€μ—μ„œλŠ” MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법에 λŒ€ν•΄ μƒμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ‚¬μš©λ²•

  1. MERGE INTO 문법

    • MERGE INTO 문은 μ•„λž˜μ™€ 같은 ν˜•μ‹μœΌλ‘œ μž‘μ„±λ©λ‹ˆλ‹€.
    MERGE INTO target_table [AS target_alias]
    USING
        source_table [AS source_alias]
    ON
        <join_condition>
    WHEN MATCHED THEN
        <update_statement>
    WHEN NOT MATCHED THEN
        <insert_statement>
    • target_table: UPDATE λ˜λŠ” INSERTλ₯Ό μˆ˜ν–‰ν•  λŒ€μƒ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
    • AS target_alias (Optional): λŒ€μƒ ν…Œμ΄λΈ”μ˜ 별칭(alias)을 μ§€μ •ν•©λ‹ˆλ‹€.
    • source_table: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό 쑰인할 μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
    • AS source_alias (Optional): μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 별칭(alias)을 μ§€μ •ν•©λ‹ˆλ‹€.
    • <join_condition>: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•œ 쑰건을 μ§€μ •ν•©λ‹ˆλ‹€.
    • <update_statement>: 쑰인된 행에 λŒ€ν•œ μ—…λ°μ΄νŠΈ μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
    • <insert_statement>: μ‘°μΈλ˜μ§€ μ•Šμ€ μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 행에 λŒ€ν•œ μ‚½μž…(insert) μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
  2. MERGE INTOλ₯Ό μ‚¬μš©ν•œ κΈ€μ“°κΈ° μ˜ˆμ‹œ

    • μ•„λž˜μ˜ μ˜ˆμ‹œλ₯Ό 톡해 MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
    MERGE INTO posts AS target
    USING new_posts AS source
    ON (target.id = source.id)
    WHEN MATCHED THEN
        UPDATE SET target.title = source.title, target.content = source.content
    WHEN NOT MATCHED THEN
        INSERT (id, title, content) VALUES (source.id, source.title, source.content)
    • μœ„μ˜ μ˜ˆμ‹œμ—μ„œ posts ν…Œμ΄λΈ”μ€ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λŒ€μƒ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
    • new_posts ν…Œμ΄λΈ”μ€ μƒˆλ‘œ μž‘μ„±ν•œ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” μ†ŒμŠ€ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
    • idλ₯Ό κΈ°μ€€μœΌλ‘œ posts와 new_postsλ₯Ό μ‘°μΈν•˜λ©°, 쑰인된 글은 titleκ³Ό contentλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³ , μ‘°μΈλ˜μ§€ μ•Šμ€ 글은 id, title, contentλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

μ•„λž˜λŠ” MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±λœ κΈ€μ“°κΈ° μ˜ˆμ‹œμž…λ‹ˆλ‹€.

MERGE INTO posts AS target
USING new_posts AS source
ON (target.id = source.id)
WHEN MATCHED THEN
    UPDATE SET target.title = source.title, target.content = source.content
WHEN NOT MATCHED THEN
    INSERT (id, title, content) VALUES (source.id, source.title, source.content)

μž₯단점

MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•  λ•Œμ˜ μž₯단점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • μž₯점:

    • λ³„λ„μ˜ 쑰건을 ν™•μΈν•˜μ§€ μ•Šκ³ λ„ ν…Œμ΄λΈ”μ„ μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ μΆ”κ°€ν•  수 μžˆμœΌλ―€λ‘œ μž‘μ„± μ‹œκ°„κ³Ό λ…Έλ ₯을 μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•œ 번의 쿼리둜 λ™μ‹œμ— μ—…λ°μ΄νŠΈμ™€ μΆ”κ°€ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 단점:

    • λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ ꡬ쑰와 컬럼 μˆœμ„œκ°€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    • MERGE INTO 문법은 κ°„λ‹¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, 처음 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” 쑰금 λ³΅μž‘ν•΄ 보일 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  경우 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°λ‘ 

MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€ μ—…λ°μ΄νŠΈμ™€ μΆ”κ°€ μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έλ¬Έμ—μ„œ μ„€λͺ…ν•œ μ‚¬μš©λ²•μ„ μ°Έκ³ ν•˜μ—¬ 적절히 ν™œμš©ν•΄ λ³΄μ„Έμš”. MERGE INTO의 μž₯점과 단점을 κ³ λ €ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬ 사항에 λ§žλŠ” 방식을 μ„ νƒν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

MERGE INTOλ₯Ό μ‚¬μš©ν•˜λŠ” κΈ€μ“°κΈ° 방법

MERGE INTO 문은 데이터가 있으면 UPDATEλ₯Ό μˆ˜ν–‰ν•˜κ³ , μ—†μœΌλ©΄ INSERTλ₯Ό μˆ˜ν–‰ν•˜λŠ” SQL κ΅¬λ¬Έμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ μ‰½κ²Œ μ—…λ°μ΄νŠΈν•˜κ³  μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έ κΈ€μ—μ„œλŠ” MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법에 λŒ€ν•΄ μƒμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ‚¬μš©λ²•

  1. MERGE INTO 문법

    • MERGE INTO 문은 μ•„λž˜μ™€ 같은 ν˜•μ‹μœΌλ‘œ μž‘μ„±λ©λ‹ˆλ‹€.
    MERGE INTO target_table [AS target_alias]
    USING
        source_table [AS source_alias]
    ON
        <join_condition>
    WHEN MATCHED THEN
        <update_statement>
    WHEN NOT MATCHED THEN
        <insert_statement>
    • target_table: UPDATE λ˜λŠ” INSERTλ₯Ό μˆ˜ν–‰ν•  λŒ€μƒ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
    • AS target_alias (Optional): λŒ€μƒ ν…Œμ΄λΈ”μ˜ 별칭(alias)을 μ§€μ •ν•©λ‹ˆλ‹€.
    • source_table: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό 쑰인할 μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
    • AS source_alias (Optional): μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 별칭(alias)을 μ§€μ •ν•©λ‹ˆλ‹€.
    • <join_condition>: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•œ 쑰건을 μ§€μ •ν•©λ‹ˆλ‹€.
    • <update_statement>: 쑰인된 행에 λŒ€ν•œ μ—…λ°μ΄νŠΈ μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
    • <insert_statement>: μ‘°μΈλ˜μ§€ μ•Šμ€ μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 행에 λŒ€ν•œ μ‚½μž…(insert) μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
  2. MERGE INTOλ₯Ό μ‚¬μš©ν•œ κΈ€μ“°κΈ° μ˜ˆμ‹œ

    • μ•„λž˜μ˜ μ˜ˆμ‹œλ₯Ό 톡해 MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
    MERGE INTO posts AS target
    USING new_posts AS source
    ON (target.id = source.id)
    WHEN MATCHED THEN
        UPDATE SET target.title = source.title, target.content = source.content
    WHEN NOT MATCHED THEN
        INSERT (id, title, content) VALUES (source.id, source.title, source.content)
    • μœ„μ˜ μ˜ˆμ‹œμ—μ„œ posts ν…Œμ΄λΈ”μ€ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λŒ€μƒ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
    • new_posts ν…Œμ΄λΈ”μ€ μƒˆλ‘œ μž‘μ„±ν•œ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” μ†ŒμŠ€ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
    • idλ₯Ό κΈ°μ€€μœΌλ‘œ posts와 new_postsλ₯Ό μ‘°μΈν•˜λ©°, 쑰인된 글은 titleκ³Ό contentλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³ , μ‘°μΈλ˜μ§€ μ•Šμ€ 글은 id, title, contentλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

μž₯단점

MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•  λ•Œμ˜ μž₯단점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • μž₯점:

    • λ³„λ„μ˜ 쑰건을 ν™•μΈν•˜μ§€ μ•Šκ³ λ„ ν…Œμ΄λΈ”μ„ μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ μΆ”κ°€ν•  수 μžˆμœΌλ―€λ‘œ μž‘μ„± μ‹œκ°„κ³Ό λ…Έλ ₯을 μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•œ 번의 쿼리둜 λ™μ‹œμ— μ—…λ°μ΄νŠΈμ™€ μΆ”κ°€ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 단점:

    • λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ ꡬ쑰와 컬럼 μˆœμ„œκ°€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    • MERGE INTO 문법은 κ°„λ‹¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, 처음 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” 쑰금 λ³΅μž‘ν•΄ 보일 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  경우 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°λ‘ 

MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€ μ—…λ°μ΄νŠΈμ™€ μΆ”κ°€ μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έλ¬Έμ—μ„œ μ„€λͺ…ν•œ μ‚¬μš©λ²•μ„ μ°Έκ³ ν•˜μ—¬ 적절히 ν™œμš©ν•΄ λ³΄μ„Έμš”. MERGE INTO의 μž₯점과 단점을 κ³ λ €ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬ 사항에 λ§žλŠ” 방식을 μ„ νƒν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

λͺ©μ°¨: MERGE INTOλ₯Ό μ‚¬μš©ν•˜λŠ” κΈ€μ“°κΈ° 방법

1. μ‚¬μš©λ²•

  • MERGE INTO 문법
  • MERGE INTOλ₯Ό μ‚¬μš©ν•œ κΈ€μ“°κΈ° μ˜ˆμ‹œ

2. μž₯단점

  • μž₯점
  • 단점

3. κ²°λ‘ 

1. μ†Œκ°œ

이번 κΈ€μ—μ„œλŠ” MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ° 방법에 λŒ€ν•΄ μƒμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. MERGE INTO 문은 데이터가 있으면 UPDATEλ₯Ό μˆ˜ν–‰ν•˜κ³ , μ—†μœΌλ©΄ INSERTλ₯Ό μˆ˜ν–‰ν•˜λŠ” SQL κ΅¬λ¬Έμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ μ‰½κ²Œ μ—…λ°μ΄νŠΈν•˜κ³  μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έ κΈ€μ—μ„œλŠ” MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. λ§ˆν¬λ‹€μš΄ ν˜•μ‹μœΌλ‘œ μ•ˆλ‚΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

2. μ‚¬μš©λ²•

2.1 MERGE INTO 문법

MERGE INTO 문은 μ•„λž˜μ™€ 같은 ν˜•μ‹μœΌλ‘œ μž‘μ„±λ©λ‹ˆλ‹€:

MERGE INTO target_table [AS target_alias]
USING
   source_table [AS source_alias]
ON
   <join_condition>
WHEN MATCHED THEN
   <update_statement>
WHEN NOT MATCHED THEN
   <insert_statement>
  • target_table: UPDATE λ˜λŠ” INSERTλ₯Ό μˆ˜ν–‰ν•  λŒ€μƒ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
  • AS target_alias (Optional): λŒ€μƒ ν…Œμ΄λΈ”μ˜ 별칭(alias)을 μ§€μ •ν•©λ‹ˆλ‹€.
  • source_table: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό 쑰인할 μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
  • AS source_alias (Optional): μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 별칭(alias)을 μ§€μ •ν•©λ‹ˆλ‹€.
  • <join_condition>: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•œ 쑰건을 μ§€μ •ν•©λ‹ˆλ‹€.
  • <update_statement>: 쑰인된 행에 λŒ€ν•œ μ—…λ°μ΄νŠΈ μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
  • <insert_statement>: μ‘°μΈλ˜μ§€ μ•Šμ€ μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 행에 λŒ€ν•œ μ‚½μž…(insert) μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.

2.2 MERGE INTOλ₯Ό μ‚¬μš©ν•œ κΈ€μ“°κΈ° μ˜ˆμ‹œ

μ•„λž˜μ˜ μ˜ˆμ‹œλ₯Ό 톡해 MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

MERGE INTO posts AS target
USING new_posts AS source
ON (target.id = source.id)
WHEN MATCHED THEN
   UPDATE SET target.title = source.title, target.content = source.content
WHEN NOT MATCHED THEN
   INSERT (id, title, content) VALUES (source.id, source.title, source.content)

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ:

  • posts ν…Œμ΄λΈ”μ€ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λŒ€μƒ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
  • new_posts ν…Œμ΄λΈ”μ€ μƒˆλ‘œ μž‘μ„±ν•œ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” μ†ŒμŠ€ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
  • idλ₯Ό κΈ°μ€€μœΌλ‘œ posts와 new_postsλ₯Ό μ‘°μΈν•˜λ©°, 쑰인된 글은 titleκ³Ό contentλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³ , μ‘°μΈλ˜μ§€ μ•Šμ€ 글은 id, title, contentλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

3. μž₯단점

MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•  λ•Œμ˜ μž₯단점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

3.1 μž₯점

  • λ³„λ„μ˜ 쑰건을 ν™•μΈν•˜μ§€ μ•Šκ³ λ„ ν…Œμ΄λΈ”μ„ μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ μΆ”κ°€ν•  수 μžˆμœΌλ―€λ‘œ μž‘μ„± μ‹œκ°„κ³Ό λ…Έλ ₯을 μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•œ 번의 쿼리둜 λ™μ‹œμ— μ—…λ°μ΄νŠΈμ™€ μΆ”κ°€ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3.2 단점

  • λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ ꡬ쑰와 컬럼 μˆœμ„œκ°€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • MERGE INTO 문법은 κ°„λ‹¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, 처음 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” 쑰금 λ³΅μž‘ν•΄ 보일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  경우 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. κ²°λ‘ 

MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€ μ—…λ°μ΄νŠΈμ™€ μΆ”κ°€ μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έλ¬Έμ—μ„œ μ„€λͺ…ν•œ μ‚¬μš©λ²•μ„ μ°Έκ³ ν•˜μ—¬ 적절히 ν™œμš©ν•΄ λ³΄μ„Έμš”. MERGE INTO의 μž₯점과 단점을 κ³ λ €ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬ 사항에 λ§žλŠ” 방식을 μ„ νƒν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

2. μ‚¬μš©λ²•

MERGE INTO 문을 μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법을 μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. MERGE INTO 문은 데이터가 이미 μ‘΄μž¬ν•˜λŠ” 경우 UPDATEλ₯Ό μˆ˜ν–‰ν•˜κ³ , 데이터가 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 INSERTλ₯Ό μˆ˜ν–‰ν•˜λŠ” SQL κ΅¬λ¬Έμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ κ°„νŽΈν•˜κ²Œ μ—…λ°μ΄νŠΈν•˜κ³  μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ—μ„œλŠ” MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. κΈ€ μž‘μ„±μ— λŒ€ν•œ μ˜ˆμ‹œλŠ” λ§ˆν¬λ‹€μš΄ ν˜•μ‹μœΌλ‘œ μ•ˆλ‚΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

2.1 MERGE INTO 문법

MERGE INTO 문은 λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ μž‘μ„±λ©λ‹ˆλ‹€:

MERGE INTO target_table [AS target_alias]
USING
   source_table [AS source_alias]
ON
   <join_condition>
WHEN MATCHED THEN
   <update_statement>
WHEN NOT MATCHED THEN
   <insert_statement>
  • target_table: μ—…λ°μ΄νŠΈ λ˜λŠ” μ‚½μž…μ„ μˆ˜ν–‰ν•  λŒ€μƒ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
  • AS target_alias (Optional): λŒ€μƒ ν…Œμ΄λΈ”μ— λŒ€ν•œ 별칭(alias)을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • source_table: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό 쑰인할 μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
  • AS source_alias (Optional): μ†ŒμŠ€ ν…Œμ΄λΈ”μ— λŒ€ν•œ 별칭(alias)을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • <join_condition>: λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μ†ŒμŠ€ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•œ 쑰건을 μ§€μ •ν•©λ‹ˆλ‹€.
  • <update_statement>: 쑰인된 행에 λŒ€ν•œ μ—…λ°μ΄νŠΈ μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
  • <insert_statement>: μ‘°μΈλ˜μ§€ μ•Šμ€ μ†ŒμŠ€ ν…Œμ΄λΈ”μ˜ 행에 λŒ€ν•œ μ‚½μž…(insert) μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.

2.2 MERGE INTOλ₯Ό μ‚¬μš©ν•œ κΈ€μ“°κΈ° μ˜ˆμ‹œ

μ•„λž˜ μ˜ˆμ‹œλ₯Ό 톡해 MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ€μ“°κΈ°λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법을 μ•Œμ•„λ΄…μ‹œλ‹€.

MERGE INTO posts AS target
USING new_posts AS source
ON (target.id = source.id)
WHEN MATCHED THEN
   UPDATE SET target.title = source.title, target.content = source.content
WHEN NOT MATCHED THEN
   INSERT (id, title, content) VALUES (source.id, source.title, source.content)

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ:

  • posts ν…Œμ΄λΈ”μ€ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λŒ€μƒ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
  • new_posts ν…Œμ΄λΈ”μ€ μƒˆλ‘œ μž‘μ„±ν•œ κΈ€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” μ†ŒμŠ€ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
  • idλ₯Ό κΈ°μ€€μœΌλ‘œ posts와 new_postsλ₯Ό μ‘°μΈν•˜μ—¬, 쑰인된 글은 titleκ³Ό contentλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³ , μ‘°μΈλ˜μ§€ μ•Šμ€ 글은 id, title, contentλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆμ‹œλ₯Ό μ°Έκ³ ν•˜μ—¬ MERGE INTO 문을 μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법을 μ΅νžˆμ‹œκΈ° λ°”λžλ‹ˆλ‹€.

3. μ˜ˆμ‹œ

이제 μ‹€μ œ μ˜ˆμ‹œλ₯Ό 톡해 MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법을 μƒμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œλ₯Ό μ°Έκ³ ν•˜μ—¬ μ‹€μ œλ‘œ 글을 μž‘μ„±ν•΄λ³΄μ„Έμš”.

3.1 μ˜ˆμ‹œ 데이터

μš°μ„ , μž‘μ„±ν•  글을 λ‹΄κ³  μžˆλŠ” new_posts ν…Œμ΄λΈ”κ³Ό 글이 μ €μž₯될 posts ν…Œμ΄λΈ”μ„ 생성해야 ν•©λ‹ˆλ‹€. μ˜ˆμ‹œλ₯Ό μœ„ν•΄ 각 ν…Œμ΄λΈ”μ˜ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

CREATE TABLE new_posts (
    id INT,
    title VARCHAR(255),
    content TEXT
);

CREATE TABLE posts (
    id INT,
    title VARCHAR(255),
    content TEXT
);

λ˜ν•œ, new_posts ν…Œμ΄λΈ”μ— μž‘μ„±ν•  κΈ€μ˜ 정보λ₯Ό μ‚½μž…ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ˜ˆμ‹œλ₯Ό μœ„ν•΄ μ•„λž˜μ™€ 같은 데이터λ₯Ό new_posts ν…Œμ΄λΈ”μ— μ‚½μž…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

INSERT INTO new_posts (id, title, content)
VALUES (1, '첫 번째 κΈ€', '이 글은 첫 번째 κΈ€μž…λ‹ˆλ‹€.'),
       (2, '두 번째 κΈ€', '이 글은 두 번째 κΈ€μž…λ‹ˆλ‹€.');

3.2 MERGE INTOλ₯Ό μ‚¬μš©ν•œ κΈ€μ“°κΈ°

μ‹€μ œλ‘œ 글을 μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œ 쿼리λ₯Ό μ‹€ν–‰ν•˜μ—¬ new_posts ν…Œμ΄λΈ”μ˜ 글을 posts ν…Œμ΄λΈ”λ‘œ λ³‘ν•©ν•˜μ„Έμš”:

MERGE INTO posts AS target
USING new_posts AS source
ON (target.id = source.id)
WHEN MATCHED THEN
   UPDATE SET target.title = source.title, target.content = source.content
WHEN NOT MATCHED THEN
   INSERT (id, title, content) VALUES (source.id, source.title, source.content);

μœ„μ˜ 쿼리λ₯Ό μ‹€ν–‰ν•˜λ©΄ new_posts ν…Œμ΄λΈ”κ³Ό posts ν…Œμ΄λΈ”μ΄ μ‘°μΈλ˜μ–΄, 쑰인된 글은 titleκ³Ό contentκ°€ μ—…λ°μ΄νŠΈλ˜κ³ , μ‘°μΈλ˜μ§€ μ•Šμ€ 글은 id, title, contentκ°€ posts ν…Œμ΄λΈ”μ— μ‚½μž…λ©λ‹ˆλ‹€. μ˜ˆμ‹œμ—μ„œλŠ” new_posts ν…Œμ΄λΈ”μ— 두 개의 글이 μžˆμœΌλ―€λ‘œ, posts ν…Œμ΄λΈ”μ—λ„ 두 개의 글이 μž‘μ„±λ©λ‹ˆλ‹€.

posts ν…Œμ΄λΈ”μ˜ λ‚΄μš©μ„ ν™•μΈν•΄λ³΄μ„Έμš”. μ•„λž˜ 쿼리λ₯Ό μ‹€ν–‰ν•˜μ—¬ 글이 μž‘μ„±λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

SELECT * FROM posts;

μœ„μ˜ 쿼리λ₯Ό μ‹€ν–‰ν•˜λ©΄ posts ν…Œμ΄λΈ”μ— μž‘μ„±λœ κΈ€μ˜ 정보λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

이제 MERGE INTOλ₯Ό μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법을 μ‹€μ œ μ˜ˆμ‹œλ₯Ό 톡해 μ΅ν˜”μŠ΅λ‹ˆλ‹€. 본인의 ν”„λ‘œμ νŠΈλ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ μš©ν•  λ•Œμ—λŠ” μ˜ˆμ‹œλ₯Ό μ°Έκ³ ν•˜μ—¬ 적절히 ν™œμš©ν•΄λ³΄μ„Έμš”.

4. μž₯단점

MERGE INTO 문을 μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” λ°©λ²•μ—λŠ” λ‹€μ–‘ν•œ μž₯단점이 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ—μ„œλŠ” MERGE INTO의 μž₯단점을 μžμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

4.1 μž₯점

4.1.1 κ°„νŽΈν•œ 데이터 처리

MERGE INTO 문은 이미 μ‘΄μž¬ν•˜λŠ” λ°μ΄ν„°μ˜ μ—…λ°μ΄νŠΈμ™€ μƒˆλ‘œμš΄ λ°μ΄ν„°μ˜ μ‚½μž…μ„ ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” λ³„λ„μ˜ μ‘°κ±΄λ¬Έμ΄λ‚˜ 좔가적인 λ‘œμ§μ„ μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ 데이터λ₯Ό 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, ν•œ 번의 쿼리둜 μ—¬λŸ¬ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμ–΄ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4.2 단점

4.2.1 λ³΅μž‘ν•œ 쑰건 처리의 어렀움

MERGE INTO 문을 μ‚¬μš©ν•  λ•Œ 쑰인 μ‘°κ±΄μ΄λ‚˜ μ—…λ°μ΄νŠΈ 쑰건을 μ •ν™•νžˆ 지정해야 ν•©λ‹ˆλ‹€. 쑰건 μ²˜λ¦¬κ°€ λ³΅μž‘ν•œ 경우, MERGE INTO 문을 μ‚¬μš©ν•˜λŠ” 것이 였히렀 번거둜울 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹¨μˆœν•œ μ‚½μž…μ΄λ‚˜ μ—…λ°μ΄νŠΈ μž‘μ—…μ΄ μ•„λ‹Œ λ³΅μž‘ν•œ 쑰건 μ²˜λ¦¬κ°€ ν•„μš”ν•œ κ²½μš°μ—λŠ” λ‹€λ₯Έ 방법을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4.2.2 μ„±λŠ₯ μ €ν•˜

MERGE INTO 문은 λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 쑰인 μ—°μ‚°μ΄λ‚˜ μ—…λ°μ΄νŠΈ μž‘μ—…μ΄ λΉ„μš©μ΄ 큰 μž‘μ—…μ΄λ―€λ‘œ, ν…Œμ΄λΈ”μ˜ ν¬κΈ°λ‚˜ 인덱슀 μ„€μ • 여뢀에 따라 μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€. 특히 MERGE INTO 문을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” 쑰건 μ²˜λ¦¬μ— λŒ€ν•œ μ£Όμ˜κ°€ ν•„μš”ν•˜λ©°, μ„±λŠ₯ νŠœλ‹ μ—­μ‹œ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4.3 μš”μ•½

MERGE INTO 문을 μ‚¬μš©ν•˜μ—¬ 글을 μž‘μ„±ν•˜λŠ” 방법은 κ°„νŽΈν•˜κ³  효율적인 데이터 처리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. ν•œ 번의 쿼리둜 μ—…λ°μ΄νŠΈμ™€ μ‚½μž… μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμ–΄ κ°œλ°œμžλŠ” μž‘μ„±ν•  μ½”λ“œλ‚˜ λ‘œμ§μ„ μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³΅μž‘ν•œ 쑰건 μ²˜λ¦¬μ—λŠ” 어렀움이 μžˆμ„ 수 있고, λŒ€λŸ‰μ˜ 데이터 처리 μ‹œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž₯단점을 κ³ λ €ν•˜μ—¬ MERGE INTOλ₯Ό μ‚¬μš©ν•  λ•Œ μ μ ˆν•œ μƒν™©μ—μ„œ ν™œμš©ν•΄λ³΄μ„Έμš”.

5. κ²°λ‘ 

MERGE INTO 문은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 글을 μž‘μ„±ν•˜λŠ” 데에 효과적으둜 μ‚¬μš©λ  수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. λ³΅μž‘ν•œ 쑰건 처리λ₯Ό κ°„νŽΈν•˜κ²Œ ν•΄κ²°ν•  수 있고, μ—…λ°μ΄νŠΈμ™€ μ‚½μž… μž‘μ—…μ„ ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆμ–΄ 효율적인 데이터 처리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, μž₯점과 단점을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. MERGE INTO 문을 μ‚¬μš©ν•  λ•ŒλŠ” 쑰인 쑰건과 μ—…λ°μ΄νŠΈ 쑰건을 μ •ν™•νžˆ 지정해야 ν•©λ‹ˆλ‹€. λ³΅μž‘ν•œ 쑰건 μ²˜λ¦¬κ°€ ν•„μš”ν•œ κ²½μš°μ—λŠ” λ‹€λ₯Έ 방법을 κ³ λ €ν•΄μ•Όν•©λ‹ˆλ‹€. λ˜ν•œ, λŒ€λŸ‰μ˜ 데이터 처리 μ‹œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ μ„±λŠ₯ νŠœλ‹μ— μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

결둠적으둜, MERGE INTO 문은 데이터λ₯Ό 효율적으둜 μ²˜λ¦¬ν•˜κ³  λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•˜λŠ” 데에 μœ μš©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ, μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, μž‘μ—…μ˜ λ³΅μž‘μ„±κ³Ό μ„±λŠ₯에 λŒ€ν•œ κ³ λ €κ°€ ν•„μš”ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬μ‚¬ν•­κ³Ό 상황에 맞게 νƒ€ν˜‘μ μ„ μ°Ύμ•„μ„œ μ μš©ν•΄λ³΄μ„Έμš”.

λŒ“κΈ€