คำถามติดแท็ก upsert

สำหรับปัญหาที่เกี่ยวข้องกับการดำเนินการเพิ่ม (อัพเดต / แทรกรวมกัน)

11
แทรกลงในตาราง MySQL หรืออัปเดตถ้ามี
ฉันต้องการเพิ่มแถวในตารางฐานข้อมูล แต่หากมีแถวที่มีคีย์เฉพาะเหมือนกันฉันต้องการอัปเดตแถว ตัวอย่างเช่น: insert into table (id, name, age) values(1, "A", 19) สมมติว่าคีย์ที่ไม่ซ้ำกันidและในของฉันฐานข้อมูลid = 1มีแถวที่มี ในกรณีนั้นฉันต้องการอัปเดตแถวนั้นด้วยค่าเหล่านี้ โดยปกติจะทำให้เกิดข้อผิดพลาด ถ้าฉันใช้insert IGNOREมันจะไม่สนใจข้อผิดพลาด แต่ก็ยังไม่อัปเดต

16
แทรกเมื่อมีการอัพเดทซ้ำใน PostgreSQL?
หลายเดือนที่ผ่านมาฉันได้เรียนรู้จากคำตอบใน Stack Overflow วิธีดำเนินการอัปเดตหลายรายการพร้อมกันใน MySQL โดยใช้ไวยากรณ์ต่อไปนี้: INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z) ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2); ตอนนี้ฉันเปลี่ยนมาใช้ PostgreSQL แล้วและนี่ก็ไม่ถูกต้อง มันหมายถึงตารางที่ถูกต้องทั้งหมดดังนั้นฉันคิดว่ามันเป็นเรื่องของการใช้คำหลักที่แตกต่างกัน แต่ฉันไม่แน่ใจว่าในเอกสาร PostgreSQL ที่ครอบคลุมนี้ เพื่อชี้แจงฉันต้องการแทรกหลายสิ่งและหากมีอยู่แล้วเพื่ออัปเดต

21
โซลูชั่นสำหรับ INSERT หรือ UPDATE บน SQL Server
MyTable(KEY, datafield1, datafield2...)สมมติโครงสร้างตาราง บ่อยครั้งที่ฉันต้องการอัปเดตระเบียนที่มีอยู่หรือแทรกระเบียนใหม่หากไม่มีอยู่ เป็นหลัก: IF (key exists) run update command ELSE run insert command วิธีที่ดีที่สุดในการเขียนสิ่งนี้คืออะไร?

18
SQLite - UPSERT * ไม่ใช่ * INSERT หรือ REPLACE
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 …
535 sql  sqlite  upsert 

17
Postgres: INSERT หากไม่มีอยู่แล้ว
ฉันใช้ Python เพื่อเขียนไปยังฐานข้อมูล postgres: sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES (" sql_string += hundred + ", '" + hundred_slug + "', " + status + ");" cursor.execute(sql_string) แต่เนื่องจากแถวบางแถวของฉันเหมือนกันฉันได้รับข้อผิดพลาดต่อไปนี้: psycopg2.IntegrityError: duplicate key value violates unique constraint "hundred_pkey" ฉันจะเขียนคำว่า 'INSERT ได้อย่างไรถ้าไม่มีคำสั่ง SQL อยู่แล้ว? ฉันเคยเห็นข้อความที่ซับซ้อนเช่นนี้แนะนำ: IF EXISTS (SELECT * FROM invoices WHERE …

12
Oracle: วิธี UPSERT (อัปเดตหรือแทรกลงในตารางได้อย่างไร)
การดำเนินการของ UPSERT จะอัปเดตหรือแทรกแถวในตารางขึ้นอยู่กับว่าตารางมีแถวที่ตรงกับข้อมูลอยู่แล้ว: if table t has a row exists that has key X: update t set mystuff... where mykey=X else insert into t mystuff... เนื่องจาก Oracle ไม่มีคำสั่ง UPSERT เฉพาะวิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร
293 sql  oracle  merge  upsert 

6
วิธี UPSERT (รวมแทรก ... ในการอัปเดตซ้ำซ้อน) ใน PostgreSQL
คำถามที่ถามบ่อยมากที่นี่คือวิธีการเพิ่มความโกรธซึ่งเป็นสิ่งที่ MySQL เรียกINSERT ... ON DUPLICATE UPDATEและมาตรฐานรองรับเป็นส่วนหนึ่งของการMERGEดำเนินการ เนื่องจาก PostgreSQL ไม่สนับสนุนโดยตรง (ก่อนหน้า 9.5) คุณจะทำอย่างไร พิจารณาสิ่งต่อไปนี้: CREATE TABLE testtable ( id integer PRIMARY KEY, somedata text NOT NULL ); INSERT INTO testtable (id, somedata) VALUES (1, 'fred'), (2, 'bob'); ตอนนี้คิดว่าคุณต้องการที่จะ "upsert" tuples (2, 'Joe'), (3, 'Alan')ดังนั้นเนื้อหาตารางใหม่จะเป็น: (1, 'fred'), (2, 'Joe'), -- Changed …


1
PostgreSQL INSERT ON CONFLICT UPDATE (upsert) ใช้ค่าที่ยกเว้นทั้งหมด
เมื่อคุณเพิ่มแถว (PostgreSQL> = 9.5) และคุณต้องการให้ INSERT ที่เป็นไปได้ตรงกับการอัปเดตที่เป็นไปได้คุณสามารถเขียนได้ดังนี้: INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET id=EXCLUDED.id, username=EXCLUDED.username, password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email มีวิธีที่สั้นกว่านี้ไหม? เพื่อบอกว่า: ใช้ค่า EXCLUDE ทั้งหมด ใน SQLite ฉันเคยทำ: INSERT OR REPLACE INTO tablename (id, user, password, level, email) VALUES …

6
วิธีใช้ RETURNING ด้วย ON CONFLICT ใน PostgreSQL
ฉันมี UPSERT ต่อไปนี้ใน PostgreSQL 9.5: INSERT INTO chats ("user", "contact", "name") VALUES ($1, $2, $3), ($2, $1, NULL) ON CONFLICT("user", "contact") DO NOTHING RETURNING id; หากไม่มีข้อขัดแย้งมันจะคืนค่าดังนี้: ---------- | id | ---------- 1 | 50 | ---------- 2 | 51 | ---------- แต่ถ้ามีข้อขัดแย้งมันจะไม่ส่งคืนแถวใด ๆ : ---------- | id | ---------- ฉันต้องการส่งคืนidคอลัมน์ใหม่หากไม่มีความขัดแย้งหรือส่งคืนidคอลัมน์ที่มีอยู่ของคอลัมน์ที่ขัดแย้งกัน …

7
SQLite UPSERT / UPDATE หรือ INSERT
ฉันจำเป็นต้องทำการ UPSERT / INSERT หรือ UPDATE กับฐานข้อมูล SQLite มีคำสั่ง INSERT OR REPLACE ซึ่งในหลาย ๆ กรณีอาจมีประโยชน์ แต่ถ้าคุณต้องการเก็บ id ของคุณด้วยการเพิ่มอัตโนมัติเนื่องจากมีคีย์ต่างประเทศจะใช้ไม่ได้เนื่องจากจะลบแถวสร้างใหม่และส่งผลให้แถวใหม่นี้มี ID ใหม่ นี่จะเป็นตาราง: ผู้เล่น - (คีย์หลักบน id, user_name unique) | id | user_name | age | ------------------------------ | 1982 | johnny | 23 | | 1983 | steven | 29 | | …
105 database  sqlite  upsert 

9
แทรกอัปเดต proc ที่จัดเก็บไว้บน SQL Server
ฉันได้เขียน proc ที่เก็บไว้ซึ่งจะทำการอัปเดตหากมีบันทึกอยู่มิฉะนั้นจะทำการแทรก มีลักษณะดังนี้: update myTable set Col1=@col1, Col2=@col2 where ID=@ID if @@rowcount = 0 insert into myTable (Col1, Col2) values (@col1, @col2) ตรรกะของฉันที่อยู่เบื้องหลังการเขียนด้วยวิธีนี้คือการอัปเดตจะทำการเลือกโดยปริยายโดยใช้ where clause และถ้าสิ่งนั้นส่งกลับ 0 ดังนั้นการแทรกจะเกิดขึ้น ทางเลือกอื่นในการทำเช่นนี้คือทำการเลือกจากนั้นขึ้นอยู่กับจำนวนแถวที่ส่งคืนไม่ว่าจะอัปเดตหรือแทรก สิ่งนี้ฉันถือว่าไม่มีประสิทธิภาพเพราะถ้าคุณจะทำการอัปเดตมันจะทำให้เกิดการเลือก 2 ครั้ง (การเรียกเลือกอย่างชัดเจนครั้งแรกและครั้งที่สองโดยนัยในตำแหน่งของการอัปเดต) หาก proc ทำการแทรกก็จะไม่มีความแตกต่างในด้านประสิทธิภาพ ตรรกะของฉันอยู่ที่นี่หรือไม่? นี่เป็นวิธีที่คุณจะรวมส่วนแทรกและอัปเดตลงใน proc ที่จัดเก็บไว้หรือไม่?

9
ใช้หลายเป้าหมายข้อขัดแย้งในคำสั่ง ON CONFLICT
ฉันมีสองคอลัมน์ในตารางcol1, col2พวกเขาทั้งสองจะไม่ซ้ำกันจัดทำดัชนี (col1 จะไม่ซ้ำกันและเพื่อให้เป็น col2) ฉันต้องการที่จะแทรกลงในตารางนี้ใช้ON CONFLICTไวยากรณ์และอัปเดตคอลัมน์อื่น ๆ แต่ฉันไม่สามารถใช้ทั้งสองคอลัมน์ในconflict_targetประโยคได้ มันได้ผล: INSERT INTO table ... ON CONFLICT ( col1 ) DO UPDATE SET -- update needed columns here แต่จะทำอย่างไรกับหลายคอลัมน์เช่นนี้: ... ON CONFLICT ( col1, col2 ) DO UPDATE SET ....

5
SQLite INSERT - ในการอัปเดตคีย์ซ้ำ (UPSERT)
MySQL มีดังนี้: INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; เท่าที่ฉันรู้ว่าคุณสมบัตินี้ไม่มีอยู่ใน SQLite สิ่งที่ฉันอยากรู้คือมีวิธีใดบ้างที่จะได้เอฟเฟกต์เดียวกันโดยไม่ต้องดำเนินการสองแบบสอบถาม นอกจากนี้หากไม่สามารถทำได้คุณต้องการอะไร: SELECT + (INSERT หรือ UPDATE)หรือ UPDATE (+ INSERT หาก UPDATE ล้มเหลว )
98 sql  mysql  database  sqlite  upsert 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.