กลับไปหน้าบทความ

อ่าน 4 นาที

ผสาน (SQL)

ระบบ จัดการฐานข้อมูลเชิงสัมพันธ์ ใช้ คำสั่ง SQL MERGE (หรือเรียกว่า upsert ) เพื่อ แทรก เรคอร์ดใหม่ หรือ อัปเดต หรือ ลบเร คอร์ดที่มีอยู่แล้ว ขึ้นอยู่กับว่า เงื่อนไข ตรงกันหรือไม่...

ผสาน (SQL)

ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ใช้ คำสั่ง SQL MERGE (หรือเรียกว่าupsert ) เพื่อแทรกเรคอร์ดใหม่ หรืออัปเดตหรือลบเรคอร์ดที่มีอยู่แล้ว ขึ้นอยู่กับว่าเงื่อนไข ตรงกันหรือไม่ คำ สั่งนี้ได้รับการแนะนำอย่างเป็นทางการใน มาตรฐาน SQL:2003และขยายเพิ่มเติมในมาตรฐาน SQL:2008

การใช้งาน

MERGE INTO tablename USING table_reference ON ( condition ) WHEN MATCHED THEN UPDATE SET column1 = value1 [ , column2 = value2 ... ] WHEN NOT MATCHED THEN INSERT ( column1 [ , column2 ... ] ) VALUES ( value1 [ , value2 ... ] );

มีการใช้ Right Join ระหว่างตาราง เป้าหมาย (Target ) และตารางต้นทาง (Source) ( ตาราง/วิว/ซับเควรี ที่ใช้ USING ) โดยที่ตารางเป้าหมายคือตารางด้านซ้าย และตารางต้นทางคือตารางด้านขวา กฎที่ได้จากการรวมกันสี่แบบมีดังนี้:

  • ถ้า ฟิลด์ ONในแหล่งข้อมูลตรงกับ ฟิลด์ ONในข้อมูลเป้าหมาย ให้ดำเนินการอัปเดต
  • หาก ฟิลด์ ONในแหล่งข้อมูลไม่ตรงกับ ฟิลด์ ONในปลายทาง ให้ทำการINSERT
  • หาก ฟิลด์ ONไม่มีอยู่ในแหล่งข้อมูล แต่มีอยู่ในปลายทาง จะไม่มีการดำเนินการใดๆ
  • หากไม่มีฟิลด์ON ในทั้งแหล่งข้อมูลหรือเป้าหมาย จะไม่มีการดำเนินการใดๆ

หากมีแถวข้อมูลต้นทางหลายแถวที่ตรงกับแถวข้อมูลเป้าหมายที่กำหนดไว้ ระบบจะแจ้งข้อผิดพลาดตาม มาตรฐาน SQL:2003คุณไม่สามารถอัปเดตแถวข้อมูลเป้าหมายหลายครั้งด้วยคำสั่ง MERGE ได้

การนำไปใช้

ระบบจัดการฐานข้อมูลPostgreSQL [ 1 ] Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID , H2 , HSQLDB , MS SQL , MonetDB , VectorwiseและApache Derby รองรับไวยากรณ์มาตรฐานบางระบบยังเพิ่มส่วนขยาย SQL ที่ไม่เป็นมาตรฐานอีกด้วย

คำพ้องความหมาย

การใช้งานฐานข้อมูลบางอย่างใช้คำว่าupsert (ซึ่งเป็นการรวมคำว่าupdateและinsert เข้า ด้วยกัน ) สำหรับ คำสั่ง ฐานข้อมูลหรือการรวมกันของคำสั่ง ที่แทรกเรคอร์ดลงในตารางในฐานข้อมูล หากเรคอร์ดนั้นยังไม่มีอยู่ หรือหากเรคอร์ดนั้นมีอยู่แล้ว ก็จะทำการอัปเดตเรคอร์ดที่มีอยู่ คำพ้องความหมายนี้ใช้ในPostgreSQL (v9.5+) [ 2 ]และSQLite (v3.24+) [ 3 ]นอกจากนี้ยังใช้เพื่อย่อรหัสเทียมที่เทียบเท่ากับ "MERGE" ด้วย

ใช้ในMicrosoft Azure SQL Database [ 4 ]

การใช้งานที่ไม่เป็นไปตามมาตรฐานอื่นๆ

ระบบจัดการฐานข้อมูลอื่นๆ บางระบบรองรับพฤติกรรมนี้ หรือพฤติกรรมที่คล้ายคลึงกันมาก ผ่านส่วนขยาย SQL ที่ไม่ใช่มาตรฐานของตนเอง

MySQLยกตัวอย่างเช่น รองรับการใช้ไวยากรณ์[ 5 ]ซึ่งสามารถใช้เพื่อให้ได้ผลลัพธ์ที่คล้ายคลึงกัน โดยมีข้อจำกัดว่าการเชื่อมต่อระหว่างเป้าหมายและแหล่งที่มาจะต้องทำบนข้อจำกัด PRIMARY KEY หรือ UNIQUE เท่านั้น ซึ่งไม่จำเป็นต้องมีในมาตรฐาน ANSI/ISO นอกจากนี้ยังรองรับไวยากรณ์[ 6 ]ซึ่งจะพยายามแทรกข้อมูลก่อน และหากล้มเหลว จะลบแถวนั้นหากมีอยู่ แล้วจึงแทรกแถวใหม่เข้าไป นอกจากนี้ยังมีข้อความสำหรับคำสั่ง[ 7 ]ซึ่งบอกให้เซิร์ฟเวอร์ละเว้นข้อผิดพลาด "คีย์ซ้ำ" และดำเนินการต่อไป (แถวที่มีอยู่จะไม่ถูกแทรกหรืออัปเดต แต่แถวใหม่ทั้งหมดจะถูกแทรก) INSERT...ONDUPLICATEKEYUPDATE>REPLACE INTOIGNOREINSERT

SQLiteทำงานในลักษณะเดียวกัน นอกจากนี้ยังรองรับเป็นชื่อแทนเพื่อความเข้ากันได้กับ MySQL [ 8 ]INSERTORREPLACEINTOREPLACE INTO

FirebirdรองรับการทำงานMERGE INTOนี้ แต่จะไม่แสดงข้อผิดพลาดเมื่อมีแถวข้อมูลต้นทางหลายแถว นอกจากนี้ยังมีเวอร์ชันสำหรับแถวเดียวแต่เวอร์ชันหลังนี้ไม่มีตัวเลือกให้ดำเนินการที่แตกต่างกันระหว่างการแทรกและการอัปเดต (เช่น การตั้งค่าค่าลำดับใหม่เฉพาะสำหรับแถวใหม่เท่านั้น ไม่ใช่สำหรับแถวที่มีอยู่แล้ว) UPDATEORINSERTINTOtablename(columns)VALUES(values)[MATCHING(columns)]

IBM Db2ขยายไวยากรณ์ด้วย เงื่อนไข WHEN MATCHEDและWHEN NOT MATCHEDข้อความหลายรายการ โดยแยกความแตกต่างด้วย... AND some-conditionตัวตรวจสอบเงื่อนไข

Microsoft SQL Serverเพิ่มฟังก์ชันการทำงานโดยการรองรับ Guard และยังรองรับ Left Join ผ่านClauses อีกด้วยWHENNOTMATCHEDBYSOURCE

PostgreSQLรองรับการผสานตั้งแต่เวอร์ชัน 15 แต่ก่อนหน้านี้รองรับการผสานผ่าน. [ 9 ]INSERTINTO...ONCONFLICT[conflict_target]conflict_action

CUBRIDรองรับ คำสั่ง MERGE INTO[ 10 ]และรองรับการใช้ไวยากรณ์[ 11 ]นอกจากนี้ยังรองรับความเข้ากันได้กับ MySQL [ 12 ]INSERT...ONDUPLICATEKEYUPDATEREPLACE INTO

Apache Phoenixรองรับไวยากรณ์ UPSERT VALUES[ 13 ]และUPSERT SELECT[ 14 ]

Spark SQLรองรับUPDATE SET *และINSERT *ข้อความในการดำเนินการ[ 15 ]

Apache ImpalaรองรับUPSERT INTO ... SELECT. [ 16 ]

การใช้งานใน NoSQL

แนวคิดที่คล้ายกันนี้ถูกนำไปใช้ในฐานข้อมูล NoSQL บางประเภท

ในMongoDBฟิลด์ในค่าที่เชื่อมโยงกับคีย์สามารถอัปเดตได้ด้วยupdateการดำเนินการupdateหากไม่พบคีย์จะเกิดข้อผิดพลาด ในupdateการดำเนินการนั้นสามารถตั้งupsertค่าแฟล็กได้: ในกรณีนี้ ค่าใหม่จะถูกจัดเก็บโดยเชื่อมโยงกับคีย์ที่กำหนดหากไม่มีอยู่ มิฉะนั้นค่าทั้งหมดจะถูกแทนที่

ในRedisการSETดำเนินการจะกำหนดค่าที่เชื่อมโยงกับคีย์ที่กำหนด Redis ไม่ทราบรายละเอียดโครงสร้างภายในของค่า ดังนั้นการอัปเดตจึงไม่มีความหมาย การดำเนินการจึง มี ลักษณะ เป็นการตั้งค่าหรือการแทนที่SETเสมอ

ดูเพิ่มเติม

  • เอกสารประกอบ Oracle 11g Release 2เกี่ยวกับMERGE
  • เอกสารประกอบ การใช้งานFirebird 2.1MERGE
  • คำสั่ง MERGE ของ DB2 v9
  • เอกสารประกอบการใช้งาน Microsoft SQL Server
  • คำสั่งเปลี่ยนแปลงข้อมูลใน HSQLdb 2.0
  • H2 (1.2) หน้าไวยากรณ์ SQL
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Merge_(SQL)&oldid=1326543894 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ผสาน (SQL)

ระบบ จัดการฐานข้อมูลเชิงสัมพันธ์ ใช้ คำสั่ง SQL MERGE (หรือเรียกว่า upsert ) เพื่อ แทรก เรคอร์ดใหม่ หรือ อัปเดต หรือ ลบเร คอร์ดที่มีอยู่แล้ว ขึ้นอยู่กับว่า เงื่อนไข ตรงกันหรือไม่...

การใช้งาน

มีการใช้ Right Join ระหว่างตาราง เป้าหมาย (Target ) และตารางต้นทาง (Source) ( ตาราง/วิว/ซับเควรี ที่ใช้ USING ) โดยที่ตารางเป้าหมายคือตารางด้านซ้าย และตารางต้นทางคือตารางด้านขวา กฎที่ได้จากการรวมกันสี่แบบมีดังนี้:

การนำไปใช้

ระบบจัดการฐานข้อมูล PostgreSQL [ 1 ] Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID , H2 , HSQLDB , MS SQL , MonetDB , Vectorwise และ Apache Derby รองรับ ไวยากรณ์ มาตรฐาน บาง ระบบ ยัง เพิ่ม ส่วน ขยาย SQL ที่ ไม่ เป็น มาตรฐานอีกด้วย

คำพ้องความหมาย

การใช้งานฐานข้อมูลบางอย่างใช้คำว่า upsert (ซึ่ง เป็นการรวม คำว่า update และ insert เข้า ด้วยกัน ) สำหรับ คำสั่ง ฐานข้อมูล หรือการรวมกันของคำสั่ง ที่แทรกเรคอร์ดลงในตารางในฐานข้อมูล หากเรคอร์ดนั้นยังไม่มีอยู่ หรือหากเรคอร์ดนั้นมีอยู่แล้ว...