Saya ingin menambahkan baris ke tabel database, tetapi jika ada baris dengan kunci unik yang sama, saya ingin memperbarui baris.
Sebagai contoh:
insert into table (id, name, age) values(1, "A", 19)
Katakanlah kunci uniknya adalah id
, dan di Database saya , ada baris dengan id = 1
. Dalam hal ini, saya ingin memperbarui baris itu dengan nilai-nilai ini. Biasanya ini memberikan kesalahan.
Jika saya menggunakannya insert IGNORE
akan mengabaikan kesalahan, tetapi masih tidak memperbarui.
mysql
sql
insert-update
upsert
Keshan
sumber
sumber
Jawaban:
Menggunakan
INSERT ... ON DUPLICATE KEY UPDATE
PERTANYAAN:
sumber
affected row count
hasil2
ketika berhasil memperbarui (pada kunci duplikat) satu baris? Adakah yang punya hasil ini? (Data diperbarui dengan benar: artinya hanya 1 baris yang diperbarui)ON DUPLICATE KEY UPDATE
meningkatkan baris yang terkena dampak oleh 2. Ia melaporkan 0 jika tidak ada yang benar-benar diperbarui (sama seperti biasaUPDATE
).Lihat REPLACE
http://dev.mysql.com/doc/refman/5.0/id/replace.html
sumber
Saat menggunakan batch insert, gunakan sintaks berikut:
sumber
VALUES(name)
tidak berhasil, Anda dapat mencobaname = 'name_value',...;
Coba ini:
Semoga ini membantu.
sumber
Coba ini:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Catatan:
Di sini jika id adalah kunci utama maka setelah penyisipan pertama dengan
id='1'
setiap kali upaya memasukkanid='1'
akan memperbarui nama dan usia dan usia nama sebelumnya akan berubah.sumber
Semua solusi ini akan bekerja mengenai pertanyaan Anda.
Jika Anda ingin mengetahui secara detail mengenai pernyataan ini, kunjungi tautan ini
sumber
REPLACE
tidak didokumentasikan dalam dokumen tertaut.Saat menggunakan SQLite:
Asalkan itu
id
adalah kunci utama. Atau hanya memasukkan baris lain. Lihat INSERT (SQLite).sumber
replace into
dilakukan adalah "masukkan ke dalam, atau perbarui bila ada". @ OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
Hanya karena saya di sini mencari solusi ini tetapi untuk memperbarui dari tabel lain yang terstruktur identik (dalam kasus situs web saya uji DB untuk hidup DB):
Seperti disebutkan di tempat lain, hanya kolom yang ingin Anda perbarui yang perlu dimasukkan setelahnya
ON DUPLICATE KEY UPDATE
.Tidak perlu mendaftar kolom di
INSERT
atauSELECT
, meskipun saya setuju itu mungkin praktik yang lebih baik.sumber
Jika Anda ingin menjadikan
non-primary
bidang sebagai kriteria / kondisi untukON DUPLICATE
, Anda bisa membuatUNIQUE INDEX
kunci di tabel itu untuk memicuDUPLICATE
.Dan jika Anda ingin menggabungkan dua bidang untuk membuatnya unik di atas meja, Anda bisa mencapainya dengan menambahkan lebih banyak pada parameter terakhir.
Catatan, pastikan untuk menghapus terlebih dahulu semua data yang memiliki nilai yang sama
name
danage
di seluruh baris lainnya.Setelah itu, harus memicu
ON DUPLICATE
acara.sumber
Dalam kasus saya, saya membuat pertanyaan di bawah ini tetapi dalam permintaan pertama jika
id
1 sudah ada dan usia sudah ada di sana, setelah itu jika Anda membuat permintaan pertama tanpaage
dari nilaiage
tidak akan adauntuk menghindari masalah di atas, buat permintaan seperti di bawah ini
semoga akan membantu Anda ...
sumber
Dalam hal ini, Anda ingin menyimpan bidang yang lama (Misalnya: nama). Kueri akan:
sumber