เข้าใจความท้าทาย: REPLACE INTO ใน SQL Server 2005
เมื่อนักพัฒนาทำงานกับ MySQL มักจะชอบความสะดวกสบายที่คำสั่ง REPLACE INTO
มอบให้ ซึ่งช่วยให้การแทรกหรืออัปเดตบันทึกบนพื้นฐานของข้อจำกัดของคีย์เป็นเรื่องง่าย อย่างไรก็ตาม ผู้ที่ย้ายมาใช้ SQL Server 2005 อาจพบว่าพวกเขาไม่สามารถหาตัวแทนโดยตรงสำหรับคำสั่งที่ทรงพลังนี้ได้
ปัญหาที่เกี่ยวข้องกับการเปลี่ยนแปลง
ใน SQL Server การทำให้ฟังก์ชันการทำงานที่คล้ายคลึงกันมักจะเกี่ยวข้องกับการใช้คำสั่ง SELECT
, UPDATE
, และ INSERT
แยกกัน ซึ่งถูกห่อหุ้มในธุรกรรม สิ่งนี้อาจกลายเป็นเรื่องยุ่งยากและอาจทำให้โค้ดซ้ำซ้อนได้—บ่อยครั้งที่นักพัฒนาลงเอยด้วยการดูแลสองเวอร์ชันของตรรกะภายในแอปพลิเคชันของตน
ดังนั้นคำถามเกิดขึ้น: มีวิธีที่ เป็นสากล กว่านี้หรือไม่ในการจำลองฟังก์ชันการทำงานของ REPLACE INTO
ใน SQL Server 2005?
คู่มือทีละขั้นตอนในการจำลอง REPLACE INTO
แม้ว่า SQL Server 2005 จะไม่มีคำสั่ง REPLACE INTO
ที่สร้างขึ้นมาเอง แต่ก็สามารถทำให้เกิดพฤติกรรมที่คล้ายกันได้โดยใช้คำสั่ง SQL ที่มีอยู่ ต่อไปนี้เป็นการอธิบายวิธีที่มีประสิทธิภาพในการจำลองฟังก์ชันนี้
วิธีที่ 1: ใช้ UPDATE ตามด้วย INSERT
ขั้นตอนที่ 1: พยายามอัปเดต
ก่อนอื่นให้ลองอัปเดตบันทึก หากบันทึกมีอยู่ สิ่งนี้จะทำให้ข้อมูลของคุณเปลี่ยนแปลงตามที่ตั้งใจไว้
UPDATE tablename
SET field1 = 'ค่าใหม่',
field2 = 'ค่าที่แตกต่าง'
WHERE idfield = 7
ขั้นตอนที่ 2: จัดการกรณีที่ไม่สามารถอัปเดตได้
หลังจากพยายามอัปเดต คุณสามารถตรวจสอบว่ามีแถวใดได้รับผลกระทบหรือไม่ หากไม่มีแถวใดได้รับการอัปเดต นี่แสดงว่าบันทึกไม่ปรากฏอยู่ ทำให้คุณต้องแทรกบันทึกใหม่
IF @@ROWCOUNT = 0 AND @@ERROR = 0
BEGIN
INSERT INTO tablename (idfield, field1, field2)
VALUES (7, 'ค่าแรก', 'ค่าที่แตกต่างอีกค่า')
END
สรุปของวิธีที่ 1:
- ข้อดี: วิธีนี้ใช้ I/O น้อยโดยพยายามอัปเดตก่อนที่จะทำการแทรก ซึ่งช่วยให้กระบวนการทำงานราบรื่น
- ข้อเสีย: มันยังทำให้เกิด I/O สองครั้งถ้าจำเป็นต้องแทรก
หมายเหตุเกี่ยวกับเวอร์ชันในอนาคต: พิจารณาการอัปเกรด
ควรสังเกตว่าหากคุณมีตัวเลือก ควรพิจารณาการอัปเกรดไปยังเวอร์ชันใหม่กว่าของ SQL Server SQL Server 2008 ได้แนะนำคำสั่ง MERGE
ซึ่งปฏิบัติตามมาตรฐาน SQL:2003 และทำให้กระบวนการนี้ง่ายขึ้น:
MERGE tablename AS target
USING (VALUES ('ค่าใหม่', 'ค่าที่แตกต่าง')) AS source (field1, field2)
ON target.idfield = 7
WHEN MATCHED THEN
UPDATE SET field1 = source.field1, field2 = source.field2
WHEN NOT MATCHED THEN
INSERT (idfield, field1, field2)
VALUES (7, source.field1, source.field2)
ข้อดีของการใช้ MERGE:
- โดยทั่วไปจะต้องใช้ I/O เพียงครั้งเดียวในหลายสถานการณ์
- ไวยากรณ์กระชับมากขึ้นทำให้โค้ดมีความสะอาดขึ้น
สรุป
แม้ว่า SQL Server 2005 จะไม่สนับสนุน REPLACE INTO
แต่การใช้การรวมกันของคำสั่ง UPDATE
และ INSERT
จะช่วยให้หาทางออกที่ใช้งานได้สำหรับการทำให้เกิดผลลัพธ์ที่คล้ายกัน โดยการทำตามวิธีการที่ชี้แจงไว้ข้างต้น นักพัฒนาสามารถเพิ่มประสิทธิภาพการทำงานของฐานข้อมูลและลดการทำซ้ำของโค้ดได้อย่างมีประสิทธิภาพ
หากคุณกำลังทำงานกับ SQL Server เวอร์ชันเก่า การนำวิธีเหล่านี้ไปใช้จะช่วยปรับปรุงแนวทางการจัดการฐานข้อมูลของคุณ และท้ายที่สุดทำให้การทำงานของคุณง่ายขึ้น การพิจารณาอัปเกรดไปยังเวอร์ชันใหม่กว่าของ SQL Server จะต้องได้รับการพิจารณาเพื่อให้เกิดประสิทธิภาพสูงสุดและฟีเจอร์ที่ได้รับการปรับปรุงในระยะยาว