INSERT … ON DUPLICATE KEY (ไม่ต้องทำอะไรเลย)


184

ฉันมีตารางที่มีคีย์เฉพาะสำหรับสองคอลัมน์:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

ฉันต้องการแทรกแถวในตารางนั้น แต่ถ้ามีกุญแจอยู่ก็ไม่ต้องทำอะไร! ฉันไม่ต้องการให้เกิดข้อผิดพลาดเนื่องจากมีคีย์อยู่

ฉันรู้ว่ามีไวยากรณ์ต่อไปนี้:

INSERT ... ON DUPLICATE KEY UPDATE ...

แต่มีบางสิ่งที่ชอบ:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

คำตอบ:


332

ใช่ใช้INSERT ... ON DUPLICATE KEY UPDATE id=id(มันจะไม่ทริกเกอร์การอัพเดตแถวแม้ว่าจะidถูกกำหนดให้กับตัวเอง)

หากคุณไม่สนใจเกี่ยวกับข้อผิดพลาด (ข้อผิดพลาดการแปลงข้อผิดพลาดที่สำคัญต่างประเทศ) และเขต autoincrement อ่อนเพลีย (มันเพิ่มขึ้นแม้ว่าแถวที่ไม่ได้ใส่เนื่องจากคีย์ซ้ำ) INSERT IGNOREแล้วใช้


5
เพียงเพิ่ม IGNORE หลังจาก INSERT ส่วนที่เหลือของไวยากรณ์จะเหมือนกันหรือไม่
ufk

25
@ufk: INSERT IGNOREไม่มีON DUPLICATE KEYส่วนเช่นINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
โปรดทราบว่า INSERT IGNORE จะละเว้นข้อผิดพลาดอื่น ๆ เช่นการแปลงข้อมูลล้มเหลว
mjcopple

36
ดังนั้นฉันจะใช้ ON DUPLICATE KEY UPDATE id = id ฉันต้องการละเว้นคีย์ที่ซ้ำซ้อนเท่านั้นไม่ใช่ข้อผิดพลาดชนิดอื่น
ufk

7
ระวัง INSERT IGNORE จะเพิ่มคอลัมน์การเพิ่มอัตโนมัติแม้ว่าจะไม่ได้แทรกแถว
WorM

9

วิธีการใช้งาน 'แทรกถ้าไม่มี'?

1 REPLACE INTO

ข้อดี:

  1. ง่าย

ข้อเสีย:

  1. ช้าเกินไป.

  2. คีย์การเพิ่มโดยอัตโนมัติจะเปลี่ยน (เพิ่มขึ้น 1) หากมีรายการที่ตรงกันunique keyหรือprimary keyเพราะมันลบรายการเก่าแล้วใส่ใหม่

2 INSERT IGNORE

ข้อดี:

  1. ง่าย

ข้อเสีย:

  1. คีย์การเพิ่มโดยอัตโนมัติจะไม่เปลี่ยนแปลงหากมีรายการที่ตรงกันunique keyหรือprimary keyแต่ดัชนีการเพิ่มอัตโนมัติจะเพิ่มขึ้น 1

  2. ข้อผิดพลาด / คำเตือนอื่น ๆ จะถูกละเว้นเช่นข้อผิดพลาดในการแปลงข้อมูล

3 INSERT ... ON DUPLICATE KEY UPDATE

ข้อดี:

  1. คุณสามารถใช้ฟังก์ชั่น 'บันทึกหรืออัพเดต' ได้อย่างง่ายดายด้วยสิ่งนี้

ข้อเสีย:

  1. ดูค่อนข้างซับซ้อนหากคุณต้องการแทรกไม่อัปเดต

  2. คีย์การเพิ่มโดยอัตโนมัติจะไม่เปลี่ยนแปลงหากมีรายการที่ตรงกันunique keyหรือprimary keyแต่ดัชนีการเพิ่มอัตโนมัติจะเพิ่มขึ้น 1

4. มีวิธีใดบ้างที่จะหยุดการเพิ่มรหัสอัตโนมัติหากมีรายการที่ตรงกันunique keyหรือprimary key?

ดังที่ได้กล่าวไว้ในความคิดเห็นด้านล่างโดย @toien: "คอลัมน์การเพิ่มอัตโนมัติจะมีผลขึ้นอยู่กับการกำหนดค่าinnodb_autoinc_lock_modeหลังจากเวอร์ชัน 5.1" หากคุณใช้innodbเป็นเครื่องมือของคุณ จนถึงตอนนี้ฉันไม่เห็นทางออกที่ดีขึ้น


คอลัมน์การเพิ่มอัตโนมัติจะมีผลโดยขึ้นอยู่กับการกำหนดค่าinnodb_autoinc_lock_modeหลังจากเวอร์ชัน 5.1
toien

1

การใช้งานON DUPLICATE KEY UPDATE ...,
เชิงลบ: เนื่องจากUPDATEทรัพยากรใช้สำหรับการดำเนินการที่สอง

ใช้INSERT IGNORE ...,
ลบ: MySQL จะไม่แสดงข้อผิดพลาดหากมีสิ่งผิดปกติดังนั้นคุณจึงไม่สามารถจัดการข้อผิดพลาดได้ ใช้มันเฉพาะในกรณีที่คุณไม่สนใจคำค้นหา


@abdul มี mysql สนับสนุนสิ่งที่คุณอธิบายที่นี่หรือไม่
Lalit Tarsariya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.