Bagaimana untuk melaksanakan operasi "masukkan jika tidak wujud" dalam MySQL?
P粉005105443
P粉005105443 2023-08-29 10:59:40
0
2
548
<p>Saya mula-mula menemui artikel ini melalui carian Google, <em>Cara menulis pertanyaan INSERT if NOT EXISTS dalam SQL standard</em>, yang membincangkan jadual mutex. </p> <p>Saya mempunyai jadual dengan kira-kira 14 juta rekod. Jika saya ingin menambah lebih banyak data dalam format yang sama, adakah terdapat cara untuk memastikan rekod yang saya ingin masukkan tidak wujud tanpa menggunakan sepasang pertanyaan (iaitu satu pertanyaan untuk diperiksa dan satu pertanyaan untuk dimasukkan, dengan set keputusan kosong)? </p> Adakah <kod>unik</kod> pada medan <p>menjamin bahawa <kod>masukkan</kod> </p> <p>Nampaknya <em> hanyalah kekangan, dan apabila saya mengeluarkan sisipan melalui PHP, skripnya berdering. </p>
P粉005105443
P粉005105443

membalas semua(2)
P粉338969567

Penyelesaian:

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1)

Arahan:

Pertanyaan paling dalam

SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1

digunakan sebagai WHERE NOT EXISTS条件,检测是否已存在包含要插入数据的行。找到此类的一行后,查询可能会停止,因此LIMIT 1 (pengoptimuman mikro, boleh diabaikan).

Pertanyaan perantaraan

SELECT 'stuff for value1', 'stuff for value2' FROM DUAL

mewakili nilai yang akan dimasukkan. DUAL 是指所有 Oracle 数据库中默认存在的一种特殊的单行单列表(请参阅 https://en.wikipedia.org/wiki/DUAL_table)。在 MySQL-Server 版本 5.7.26 上,当省略 FROM DUAL 时,我得到了有效的查询,但旧版本(如 5.5.60)似乎需要 FROM 信息。通过使用 WHERE NOT EXISTS, jika pertanyaan paling dalam menemui data yang sepadan, pertanyaan tengah akan mengembalikan set hasil kosong.

Pertanyaan luaran

INSERT INTO `table` (`value1`, `value2`)

Masukkan data (jika pertanyaan perantaraan mengembalikan sebarang data).

P粉521013123

Gunakan INSERT IGNORE INTO table.

Terdapat juga INSERT … ON DUPLICATE KEY UPDATE sintaks yang anda boleh gunakan dalam 13.2.6.2 INSERT ... PADA penyataan KEMASKINI KUNCI DUA .


Siaran daripada bogdan.org.ua Berdasarkan cache web Google:

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan