มีวิธีที่ง่ายต่อINSERT
การแถวเมื่อมันไม่ได้อยู่หรือUPDATE
ถ้ามันมีอยู่โดยใช้แบบสอบถาม MySQL หนึ่ง?
มีวิธีที่ง่ายต่อINSERT
การแถวเมื่อมันไม่ได้อยู่หรือUPDATE
ถ้ามันมีอยู่โดยใช้แบบสอบถาม MySQL หนึ่ง?
คำตอบ:
INSERT ... ON DUPLICATE KEY UPDATE
ใช้ ตัวอย่างเช่น:
INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1
geb
และtopic
มันจะใช้ได้ ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
)
MERGE
แต่ฉันไม่แน่ใจว่าไวยากรณ์นั้นเหมือนกับ SQL Server หรือไม่
NULL
ไปเพื่ออนุญาตให้auto_increment
พฤติกรรมทำงานได้ (ซึ่งเป็นอย่างอื่นใช่ทำงานได้ตามที่คุณเห็นดูที่dev.mysql.com/doc/refman/5.5/th/example-auto-increment html )
VALUES(col)
เพื่อรับค่าจากอาร์กิวเมนต์การแทรกในกรณีที่ซ้ำกัน เช่น:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ Google นำฉันมาที่นี่เมื่อเร็ว ๆ นี้ดังนั้นฉันจึงจินตนาการว่ามีคนอื่นมาที่นี่ด้วย
@chaos ถูกต้อง: มีINSERT ... ON DUPLICATE KEY UPDATE
ไวยากรณ์
อย่างไรก็ตามคำถามเดิมถามเกี่ยวกับ MySQL โดยเฉพาะและใน MySQL มีREPLACE INTO ...
ไวยากรณ์ IMHO คำสั่งนี้ง่ายและตรงไปตรงมาสำหรับการใช้งาน จากคู่มือ:
REPLACE ทำงานเหมือนกับ INSERT ยกเว้นว่าหากแถวเก่าในตารางมีค่าเหมือนกับแถวใหม่สำหรับคีย์หลักหรือดัชนี UNIQUE แถวเก่าจะถูกลบก่อนที่จะแทรกแถวใหม่
หมายเหตุนี่ไม่ใช่ SQL มาตรฐาน ตัวอย่างจากคู่มือ:
CREATE TABLE test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data VARCHAR(64) DEFAULT NULL,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)
mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)
mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts |
+----+------+---------------------+
| 1 | New | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)
แก้ไข:เพียงแค่เตือนว่าไม่เหมือนREPLACE INTO
UPDATE
ดังที่คู่มือบอกREPLACE
ลบแถวถ้ามีอยู่แล้วแทรกใหม่ (หมายเหตุตลก "2 แถวได้รับผลกระทบ" ในตัวอย่างข้างต้น.) นั่นคือมันจะเข้ามาแทนที่ค่าของทุกคอลัมน์ของการบันทึกที่มีอยู่ (และไม่เพียงปรับปรุงบางคอลัมน์.) พฤติกรรมของ MySQL ที่REPLACE INTO
เป็นเหมือนที่ INSERT OR REPLACE INTO
Sqlite ดูคำถามนี้สำหรับวิธีแก้ไขปัญหาเฉพาะบางอย่างหากคุณต้องการอัปเดตคอลัมน์บางคอลัมน์เท่านั้น (และไม่ใช่ทุกคอลัมน์) หากมีระเบียนอยู่แล้ว
MERGE
จะเรียกว่า"UPSERT"
โดยทั่วไปแนวคิดมักจะถูกเรียกว่า