UPSERT - มีทางเลือกอื่นที่ดีกว่าสำหรับ MERGE หรือ @@ rowcount หรือไม่ [ปิด]


14

ฉันสงสัยว่าถ้าคุณพบคำสั่ง T-SQL ซึ่งคล้ายกับแนวคิดของ UPSERT หรือไม่ การดำเนินการ INSERT | UPDATE โดยใช้ตัวเลือก (1) หรือ (2) ดูเหมือนซับซ้อนและมีข้อผิดพลาดมากเกินไป

วัตถุประสงค์

เพื่อให้แน่ใจว่าระเบียนที่ต้องการ (ในกรณีนี้ employee_id 1) เป็นข้อมูลล่าสุดโดยไม่จำเป็นต้องเขียนคำถามเดียวกันสองครั้ง

บริบท

  • ชื่อตาราง: ลูกจ้าง
  • รหัสพนักงาน: มีคีย์หลักและตั้งค่าความเป็นตัวตนเป็นจริง

ตัวเลือก

  1. เรียกใช้ SQL UPDATE ... ตรวจสอบ @@ rowcount = 0 และ @@ error = 0 ... เรียกใช้ SQL INSERT หากจำเป็น

    • คอนดิชั่น: คุณต้องเขียนคำถามเดียวกันสองครั้งครั้งเดียวเป็นการแทรกครั้งเดียวเป็นการอัปเดต
    • con: รหัสเพิ่มเติม = พิมพ์เวลามากขึ้น
    • con: รหัสเพิ่มเติม = ห้องเพิ่มเติมสำหรับข้อผิดพลาด

/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "อัปเดตโดยใช้ @@ rowcount"

  1. รัน SQL MERGE
    • คอนดิชั่น: คุณต้องเขียนคำถามเดียวกันสองครั้งครั้งเดียวเป็นการแทรกครั้งเดียวเป็นการอัปเดต
    • con: รหัสเพิ่มเติม = พิมพ์เวลามากขึ้น
    • con: รหัสเพิ่มเติม = ห้องเพิ่มเติมสำหรับข้อผิดพลาด

http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"

  1. ดำเนินการ SQL UPSERT (ไม่มีคุณสมบัติ)
    • Pro: คุณกำหนดความสัมพันธ์ data-to-table หนึ่งครั้ง (ปล่อยให้ SQL Server กังวลว่าเป็น INSERT หรือ UPDATE หรือไม่)
    • โปร: รหัสน้อย = การใช้งานได้เร็วขึ้น
    • โปร: รหัสน้อย = ความน่าจะเป็นที่ต่ำกว่า

ตัวอย่างของ UPSERT

พนักงานของ UPSERT (employee_id, employee_number, job_title, ชื่อแรก, ชื่อกลาง, ชื่อกลาง, modified_at) ค่านิยม (1, '00 -124AB37 ',' ผู้จัดการ ',' John ',' T ',' Smith ', GetDate ());

  • ถ้า employee_id 1 ไม่มีอยู่: MS SQL ดำเนินการคำสั่ง INSERT
  • ถ้า employee_id 1 มีอยู่: MS SQL จะดำเนินการและคำสั่ง UPDATE

4
ดูเหมือนว่าคำขอคุณลักษณะของ Microsoft ไม่ใช่สิ่งที่ทุกคนที่นี่สามารถช่วยคุณแก้ปัญหาได้ โซลูชันของ Microsoft ที่มาพร้อมกับ MERGE หากนั่นยังไม่ยืดหยุ่น / มีประสิทธิภาพเพียงพอสำหรับคุณคุณต้องใช้วิธีแก้ไขปัญหาอื่นที่ยังไม่มี
Aaron Bertrand

3
ในความคิดของฉันMERGEตรงไปตรงมายืดหยุ่นและเป็นส่วนหนึ่งของ SQL Standard ปัญหาที่แท้จริงของการใช้งานMERGEและอื่น ๆUPSERTคือการเพิ่มการล็อคที่อาจเกิดขึ้นหรือแม้แต่การหยุดชะงักซึ่งไม่มีส่วนเกี่ยวข้องกับไวยากรณ์
a1ex07

หากคุณมีคำถามอย่าลังเลที่จะถาม ตามที่เขียนไว้นั้นเป็นคำติชมเกี่ยวกับMERGEการใช้งานใน SQL Server
JNK

คำถามที่ดี - มีคำสั่ง UPSERT ที่เซิร์ฟเวอร์กังวลหรือไม่ว่าจำเป็นต้องมีการแทรกหรืออัปเดต ฉันเห็นด้วย MERGE ไม่ตรงกับสิ่งที่คุณคาดหวังอย่างมีเหตุผลเกี่ยวกับการใช้ "UPSERT" เมื่อให้ MS เลือกที่จะใช้วิธีนี้คำถามของฉันคือ: สิ่งที่อาจเป็นข้อบกพร่องหรือเป็นไปไม่ได้ที่จะใช้พวกเขาพยายามที่จะใช้ไวยากรณ์ที่คุณ (และฉัน) ต้องการหรือไม่
youcantryreachingme

คำตอบ:


14

ฉันคิดว่าคำตอบง่ายๆนี้คือไม่ MERGEเป็นคำตอบของ Microsoft ต่อUPSERTตรรกะที่ซับซ้อนมากขึ้น และคุณไม่ได้ระบุวิธีที่แย่ที่สุด:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

ฉันเพิ่งพิมพ์ขึ้นมาในปากของฉันเล็กน้อย แต่จริงๆแล้วมันเป็นสิ่งที่ฉันเห็นบ่อยที่สุด

ไม่ว่าในกรณีใดหากคุณMERGEไม่ยืดหยุ่นหรือมีประสิทธิภาพเพียงพอสำหรับคุณฉันขอแนะนำให้คุณส่งคำขอคุณลักษณะไปที่ Microsoft ที่http://connect.microsoft.com/sql/และอธิบายกรณีธุรกิจของคุณอย่างละเอียด ตราบใดที่คุณยึดติดกับข้อดีที่แท้จริงของไวยากรณ์ที่คุณเสนอMERGEคุณจะได้รับการโหวตของฉัน หากคุณแขวนส่วนที่ "ผิดพลาดได้ง่ายเกินไป" ฉันไม่น่าจะซื้อเพราะอะไร เพราะคุณสามารถอ้วนคำสั่งใด ๆ

ที่กล่าวว่าฉันไม่คิดว่าจะมีใครที่นี่สามารถทำเพื่อคุณโดยเฉพาะ คุณควรตรวจสอบปัญหาที่อาจเกิดขึ้นกับMERGE:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/


2
ขอบคุณแอรอน ฉันดูเอกสาร T-SQL บน MSDN และไม่พบสิ่งที่ฉันค้นหา แค่คิดว่าฉันจะทิ้งมันไปในกรณีที่ฉันพลาดอะไรบางอย่าง ในขณะที่คำสั่ง MERGE มีเหตุผลในบางสถานการณ์ฉันอดไม่ได้ที่จะรู้สึกว่ามันเป็น "ค้อนเลื่อนเพื่อทุบตะปู" สำหรับการบันทึกที่ง่าย บางทีฉันควรสวมหมวกโปรแกรมเมอร์ของฉันและใส่ DBA Fedora ของฉัน ขอบคุณที่สละเวลาในการแบ่งปันความคิดของคุณ
Pressacco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.