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

3
วิธีการใช้ UPSERT ใน PostgreSQL
ฉันได้อ่านเกี่ยวกับUPSERTการใช้งานที่แตกต่างกันใน PostgreSQL แต่โซลูชันเหล่านี้ทั้งหมดค่อนข้างเก่าหรือค่อนข้างแปลกใหม่ (โดยใช้CTE ที่เขียนได้ ) และฉันก็ไม่ใช่ผู้เชี่ยวชาญ psql เลยที่จะรู้ได้ทันทีว่าโซลูชันเหล่านี้เก่าหรือไม่เพราะพวกเขาได้รับการแนะนำอย่างดีหรือพวกเขา (ดีเกือบทั้งหมดเป็น) เพียงตัวอย่างของเล่นที่ไม่เหมาะสมกับการใช้งานจริง อะไรคือวิธีที่ปลอดภัยที่สุดในการใช้ UPSERT ใน PostgreSQL

2
วิธีแทรกหรืออัปเดตโดยใช้ข้อความค้นหาเดียว
ฉันมีตารางทดสอบที่มีคอลัมน์ id ซึ่งเป็นคีย์หลักและเพิ่มขึ้นอัตโนมัติและชื่อ ฉันต้องการที่จะแทรกบันทึกใหม่ถ้า annd เฉพาะในกรณีที่ไม่มีบันทึกตัวอย่างเช่น อินพุตคือ id = 30122 และ name = john หากมีการบันทึกที่มี id 30122 ฉันได้อัปเดตคอลัมน์ชื่อเป็น john หากไม่มีการบันทึกฉันจะใส่บันทึกใหม่ ฉันสามารถทำได้โดยใช้ 2 แบบสอบถามเช่น select * from test where id=30122 หากมีบางบันทึกฉันสามารถใช้งานได้ update test set name='john' where id=3012 หรือถ้ามันไม่มีบันทึกฉันก็สามารถใช้งานได้ insert into test(name) values('john') แต่ฉันต้องการใช้ข้อความค้นหาเดียว? ใครสามารถบอกได้ถ้าเป็นไปได้?

2
วิธีรับ ID ของแถวที่ขัดแย้งกันใน upsert?
ฉันมีตารางที่tagมี 2 ​​คอลัมน์: id(uuid) และname(ข้อความ) ตอนนี้ฉันต้องการแทรกแท็กใหม่ลงในตาราง แต่ถ้ามีแท็กนั้นอยู่แล้วฉันต้องการเพียงรับidบันทึกที่มีอยู่ ฉันคิดว่าฉันสามารถใช้ON CONFLICT DO NOTHINGร่วมกับRETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; แต่จะส่งคืนชุดผลลัพธ์ที่ว่างเปล่าหากมีแท็กชื่อ "foo" อยู่แล้ว ฉันเปลี่ยนแบบสอบถามเพื่อใช้ส่วนDO UPDATEคำสั่งnoop : INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; มันใช้งานได้ตามที่ตั้งใจ …

2
UPSERT ที่มีความขัดแย้งโดยใช้ค่าจากตารางแหล่งที่มาในส่วน UPDATE
ได้รับ: CREATE TABLE A ( PK_A INT8 NOT NULL, A INT8, PRIMARY KEY (PK_A) ); CREATE TABLE B ( PK_B INT8 NOT NULL, B INT8, PRIMARY KEY (PK_B) ); แบบสอบถามนี้: insert into table_b (pk_b, b) select pk_a,a from table_a on conflict (b) do update set b=a; ทำให้เกิดข้อผิดพลาดดังต่อไปนี้: ERROR: column "a" …

1
'การอ้างอิงคอลัมน์ไม่ชัดเจน' เมื่อเพิ่มองค์ประกอบลงในตาราง
ฉันใช้ PostgreSQL เป็นฐานข้อมูลของฉัน และฉันจำเป็นต้องสร้างรายการในฐานข้อมูลและหากมีอยู่แล้วเพียงแค่อัปเดตฟิลด์ แต่ควรอัปเดตหนึ่งในฟิลด์ต่อไปหากยังไม่ได้ตั้งค่า ฉันใช้ข้อมูลจากคำถามนี้: /programming/13305878/dont-update-column-if-update-value-is-nullมันค่อนข้างเกี่ยวข้องกับสิ่งที่ฉันมี ฉันพยายามที่จะใช้แบบสอบถามนี้ แต่เมื่อฉันเรียกใช้มันข้อผิดพลาดกับColumn reference 'affiliate_code' is ambiguous: INSERT INTO accounts (id, token, affiliate_code) VALUES (value1, value2, value3) ON CONFLICT (id) DO UPDATE SET token = value2, affiliate_code = COALESCE(affiliate_code, value3); (ค่าจริงถูกแทนที่แน่นอน) หากฉันแทนที่affiliate_code = COALESCE(affiliate_code, value3)ด้วยaffiliate_code = value3ทุกอย่างทำงานได้ แต่ไม่ใช่ในแบบที่ฉันต้องการให้ทำงาน ฉันจะทำงานนี้ได้อย่างไร นี่คือวิธีการกำหนดตารางของฉัน: CREATE TABLE accounts ( …

1
UPSERT - มีทางเลือกอื่นที่ดีกว่าสำหรับ MERGE หรือ @@ rowcount หรือไม่ [ปิด]
เป็นการยากที่จะบอกสิ่งที่ถูกถามที่นี่ คำถามนี้คลุมเครือคลุมเครือไม่สมบูรณ์กว้างเกินไปหรือโวหารและไม่สามารถตอบได้อย่างสมเหตุสมผลในรูปแบบปัจจุบัน สำหรับความช่วยเหลือในการทำความเข้าใจคำถามนี้เพื่อที่จะสามารถเปิด, ไปที่ศูนย์ช่วยเหลือ ปิดให้บริการใน7 ปีที่ผ่านมา ฉันสงสัยว่าถ้าคุณพบคำสั่ง T-SQL ซึ่งคล้ายกับแนวคิดของ UPSERT หรือไม่ การดำเนินการ INSERT | UPDATE โดยใช้ตัวเลือก (1) หรือ (2) ดูเหมือนซับซ้อนและมีข้อผิดพลาดมากเกินไป วัตถุประสงค์ เพื่อให้แน่ใจว่าระเบียนที่ต้องการ (ในกรณีนี้ employee_id 1) เป็นข้อมูลล่าสุดโดยไม่จำเป็นต้องเขียนคำถามเดียวกันสองครั้ง บริบท ชื่อตาราง: ลูกจ้าง รหัสพนักงาน: มีคีย์หลักและตั้งค่าความเป็นตัวตนเป็นจริง ตัวเลือก เรียกใช้ SQL UPDATE ... ตรวจสอบ @@ rowcount = 0 และ @@ error = 0 ... เรียกใช้ SQL INSERT …

2
ปัญหา PostgreSQL UPSERT ด้วยค่า NULL
ฉันมีปัญหากับการใช้คุณสมบัติใหม่ของ UPSERT ใน Postgres 9.5 ฉันมีตารางที่ใช้สำหรับรวบรวมข้อมูลจากตารางอื่น คีย์ผสมประกอบด้วย 20 คอลัมน์โดย 10 ซึ่งสามารถเป็นโมฆะได้ ด้านล่างฉันได้สร้างรุ่นที่เล็กกว่าของปัญหาที่ฉันมีโดยเฉพาะกับค่าเป็นศูนย์ CREATE TABLE public.test_upsert ( upsert_id serial, name character varying(32) NOT NULL, status integer NOT NULL, test_field text, identifier character varying(255), count integer, CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id), CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field) ); การเรียกใช้คิวรีนี้ทำงานได้ตามต้องการ (แทรกครั้งแรกจากนั้นแทรกตามมาก็เพิ่มจำนวน): INSERT INTO …

1
วิธีหลีกเลี่ยงการใช้แบบสอบถามแบบผสานเมื่อทำซ้ำหลายข้อมูลโดยใช้พารามิเตอร์ xml
ฉันกำลังพยายามอัปเดตตารางด้วยอาร์เรย์ของค่าต่างๆ แต่ละรายการในอาร์เรย์มีข้อมูลที่ตรงกับแถวในตารางในฐานข้อมูล SQL Server หากแถวนั้นมีอยู่แล้วในตารางเราจะอัปเดตแถวนั้นด้วยข้อมูลในอาร์เรย์ที่กำหนด มิฉะนั้นเราจะแทรกแถวใหม่ในตาราง ฉันได้อธิบายโดยทั่วไปเพิ่มขึ้น ตอนนี้ฉันกำลังพยายามทำให้สำเร็จในโพรซีเดอร์ที่เก็บไว้ซึ่งใช้พารามิเตอร์ XML เหตุผลที่ฉันใช้ XML และไม่ใช่พารามิเตอร์ที่มีค่าเป็นตารางเนื่องจากฉันจะต้องสร้างประเภทที่กำหนดเองใน SQL และเชื่อมโยงประเภทนี้กับกระบวนงานที่เก็บไว้ หากฉันเปลี่ยนบางสิ่งบางอย่างในขั้นตอนการจัดเก็บหรือ db schema ของฉันลงที่ถนนฉันจะต้องทำซ้ำทั้งขั้นตอนการจัดเก็บและประเภทที่กำหนดเอง ฉันต้องการหลีกเลี่ยงสถานการณ์นี้ นอกจากนี้ความเหนือกว่าที่ TVP มีเหนือ XML ไม่มีประโยชน์สำหรับสถานการณ์ของฉันเพราะขนาดอาร์เรย์ข้อมูลของฉันจะไม่เกิน 1,000 ซึ่งหมายความว่าฉันไม่สามารถใช้โซลูชันที่เสนอที่นี่: วิธีแทรกหลายระเบียนโดยใช้ XML ใน SQL Server 2008 นอกจากนี้ยังมีการอภิปรายที่คล้ายกันที่นี่ ( UPSERT - มีทางเลือกที่ดีกว่าสำหรับ MERGE หรือ @@ rowcount หรือไม่ ) แตกต่างจากที่ฉันขอเพราะฉันพยายามเพิ่มหลายแถวไปยังตาราง ฉันหวังว่าฉันจะใช้ชุดคำสั่งต่อไปนี้เพื่อเพิ่มค่าจาก xml แต่นี่จะไม่ทำงาน วิธีการนี้ควรทำงานเมื่ออินพุตเป็นแถวเดียว begin tran …

3
ต้องการความช่วยเหลือในการแก้ไขปัญหาสถานการณ์การหยุดชะงักของ SQL Server 2005
ฉันกำลังทำงานในสถานการณ์การหยุดชะงักที่ผู้เข้าร่วมเพียงคนเดียวในการหยุดชะงักดูเหมือนจะเป็นตารางเดียวและขั้นตอนการจัดเก็บเดียวที่ถูกลบออกจากตารางนั้น ฉันดึงข้อสรุปนั้นจากการวิเคราะห์บันทึกข้อผิดพลาด sql ของฉันในช่วงเวลาของการหยุดชะงักหลายครั้งโดยใช้บทความ MSDN ด้านล่างเป็นแนวทางในการถอดรหัสการติดตามในบันทึกข้อผิดพลาด ตาราง DEXTable และขั้นตอนการจัดเก็บ ClearDEXTableRows มีการกำหนดไว้ด้านล่าง มีกระบวนงานที่เก็บไว้อีก InsertDEXTableRow ที่แทรกแถวลงใน DEXTable แต่ proc ที่ดูเหมือนจะไม่เกี่ยวข้องในการหยุดชะงักตามรายการในบันทึกข้อผิดพลาด sql DEXTable มีแถวที่อยู่ประมาณ 8.3 ล้านแถวและมีแนวโน้มที่จะเติบโตอย่างต่อเนื่อง ตารางผู้ตอบแบบสอบถามมีขนาดใหญ่และมีแนวโน้มที่จะเติบโตอย่างต่อเนื่อง มันเข้าถึงได้จากเว็บไซต์ปริมาณการใช้งานสูงที่มีหน้าเว็บที่เรียก ClearDEXTableRows และ InsertDEXTableRow บ่อย ๆ อย่างต่อเนื่อง การหยุดชะงักเกิดขึ้นระหว่าง 0 ถึง 9 ครั้งต่อวันในช่วง 10 วันที่ผ่านมา ฉันเปิดใช้งานการติดตาม sql สำหรับ 1222 (โดยใช้ DBCC TRACEON 1222) และเพิ่งเปิดใช้งานการตั้งค่าสถานะ 1204 มีคำอธิบายที่ดีเกี่ยวกับผลลัพธ์สำหรับการตั้งค่าสถานะเหล่านี้ในการตรวจจับและการสิ้นสุด Deadlocks …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.