MySQL memiliki sesuatu seperti ini:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
Sejauh yang saya tahu fitur ini tidak ada di SQLite, yang ingin saya ketahui adalah apakah ada cara untuk mencapai efek yang sama tanpa harus menjalankan dua kueri. Selain itu, jika tidak memungkinkan, apa yang Anda sukai:
- PILIH + (INSERT atau UPDATE) atau
- UPDATE (+ INSERT jika UPDATE gagal )
upsert
hal seperti ini dalam satu transaksi, yaitu denganexecutemany()
fungsi Python ?Ini membutuhkan kolom "ip" untuk memiliki batasan UNIK (atau KUNCI UTAMA).
EDIT: Solusi hebat lainnya: https://stackoverflow.com/a/4330694/89771 .
sumber
REPLACE
bukanlah suatu pilihan.Saya lebih suka
UPDATE (+ INSERT if UPDATE fails)
. Lebih sedikit kode = lebih sedikit bug.sumber
Jawaban saat ini hanya akan berfungsi di sqlite ATAU mysql (tergantung apakah Anda menggunakan ATAU atau tidak). Jadi, jika Anda menginginkan kompatibilitas cross dbms, berikut ini yang akan dilakukan ...
sumber
REPLACE
akan bekerja di SQLite juga, tetapi di MySQL itu akan selalu mengatur ulang penghitung ke 0 - sementara kueri akan portabel, hasil akhirnya akan sangat berbeda.Anda harus menggunakan memcache untuk ini karena ini adalah kunci tunggal (alamat IP) yang menyimpan satu nilai (jumlah kunjungan). Anda dapat menggunakan fungsi kenaikan atom untuk memastikan tidak ada kondisi "perlombaan".
Ini lebih cepat dari MySQL dan menghemat beban sehingga MySQL dapat fokus pada hal lain.
sumber