http://en.wikipedia.org/wiki/Upsert
แทรกการปรับปรุงที่เก็บไว้ proc บน SQL Server
มีวิธีที่ฉลาดในการทำเช่นนี้ใน SQLite ที่ฉันไม่ได้คิด?
โดยทั่วไปฉันต้องการอัปเดตสามในสี่คอลัมน์หากบันทึกมีอยู่หากไม่มีอยู่ฉันต้องการแทรกระเบียนด้วยค่าเริ่มต้น (NUL) สำหรับคอลัมน์ที่สี่
ID เป็นคีย์หลักดังนั้นจะมีเพียงหนึ่งระเบียนที่ UPSERT เท่านั้น
(ฉันพยายามหลีกเลี่ยงโอเวอร์เฮดของ SELECT เพื่อกำหนดว่าฉันต้องอัปเดตหรือแทรกอย่างชัดเจน)
ข้อเสนอแนะ?
ฉันไม่สามารถยืนยันได้ว่าไวยากรณ์บนไซต์ SQLite สำหรับ TABLE CREATE ฉันไม่ได้สร้างตัวอย่างเพื่อทดสอบ แต่ดูเหมือนจะไม่ได้รับการสนับสนุน ..
ถ้าเป็นเช่นนั้นฉันมีสามคอลัมน์ดังนั้นมันจะมีลักษณะดังนี้:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
แต่สอง blobs แรกจะไม่ทำให้เกิดความขัดแย้งเฉพาะ ID จะดังนั้นฉัน asusme Blob1 และ Blob2 จะไม่ถูกแทนที่ (ตามที่ต้องการ)
UPDATE ใน SQLite เมื่อเชื่อมโยงข้อมูลเป็นธุรกรรมที่สมบูรณ์หมายความว่าแต่ละแถวที่ส่งไปจะต้องมีการปรับปรุง: จัดเตรียม / ผูก / ขั้นตอน / จบคำสั่งซึ่งแตกต่างจาก INSERT ซึ่งอนุญาตให้ใช้ฟังก์ชันรีเซ็ต
ชีวิตของวัตถุคำสั่งจะเป็นดังนี้:
- สร้างวัตถุโดยใช้ sqlite3_prepare_v2 ()
- ผูกค่ากับพารามิเตอร์โฮสต์โดยใช้อินเตอร์เฟส sqlite3_bind_
- เรียกใช้ SQL โดยการเรียก sqlite3_step ()
- รีเซ็ตคำสั่งโดยใช้ sqlite3_reset () จากนั้นกลับไปที่ขั้นตอนที่ 2 และทำซ้ำ
- ทำลายวัตถุคำสั่งโดยใช้ sqlite3_finalize ()
อัปเดตฉันคาดเดาได้ช้ากว่า INSERT แต่จะเปรียบเทียบกับ SELECT โดยใช้คีย์หลักได้อย่างไร
บางทีฉันควรใช้ตัวเลือกเพื่ออ่านคอลัมน์ที่ 4 (Blob3) แล้วใช้ REPLACE เพื่อเขียนระเบียนใหม่โดยผสมคอลัมน์ที่ 4 เดิมกับข้อมูลใหม่สำหรับ 3 คอลัมน์แรก