Saya telah mencari-cari tetapi tidak menemukan apakah itu mungkin.
Saya memiliki permintaan MySQL ini:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
Field id memiliki "indeks unik", jadi tidak mungkin ada dua. Sekarang jika id yang sama sudah ada dalam database, saya ingin memperbaruinya. Tetapi apakah saya benar-benar harus menentukan semua bidang ini lagi, seperti:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8
Atau:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)
Saya telah menentukan semua yang sudah ada di sisipan ...
Catatan tambahan, saya ingin menggunakan pekerjaan untuk mendapatkan ID!
id=LAST_INSERT_ID(id)
Saya harap seseorang dapat memberi tahu saya apa cara yang paling efisien.
a=VALUES(a), b=VALUES(b), ...
adalah cara yang harus Anda tempuh. Begitulah cara saya melakukannya untuk semuaINSERT ON DUPLICATE KEY UPDATE
pernyataan saya .Jawaban:
The
UPDATE
pernyataan yang diberikan sehingga bidang yang lebih tua dapat diperbarui untuk nilai baru. Jika nilai lama Anda sama dengan nilai baru Anda, mengapa Anda perlu memperbaruinya?Untuk misalnya. jika kolom Anda
a
untukg
sudah ditetapkan sebagai2
untuk8
; tidak perlu memperbarui lagi.Atau, Anda dapat menggunakan:
Untuk mendapatkan
id
dariLAST_INSERT_ID
; Anda perlu menentukan aplikasi backend yang Anda gunakan untuk hal yang sama.Untuk LuaSQL, a
conn:getlastautoid()
mengambil nilai.sumber
tbl
sudah memiliki baris (1,10) maka:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
akan menetapkan a = 2 . SementaraINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
akan menetapkan = 10a=a
pembaruan apa pun. (Pertanyaan dalam pertanyaan awal juga tidak benar-benar memperbarui apa pun, tetapi pembaruan tampaknya seperti yang dimaksudkan OP.)Ada ekstensi khusus MySQL ke SQL yang mungkin Anda inginkan -
REPLACE INTO
Namun tidak berfungsi sama seperti 'ON DUPLICATE UPDATE'
Ini menghapus baris lama yang berbenturan dengan baris baru dan kemudian menyisipkan baris baru. Selama Anda tidak memiliki kunci utama pada tabel itu akan baik-baik saja, tetapi jika Anda melakukannya, maka jika ada tabel lain yang merujuk kunci utama
Anda tidak bisa mereferensikan nilai di baris lama sehingga Anda tidak bisa melakukan yang setara
Itu seharusnya bekerja - last_insert_id () harus memiliki nilai yang benar selama kunci utama Anda bertambah secara otomatis.
Namun seperti yang saya katakan, jika Anda benar-benar menggunakan kunci utama di tabel lain,
REPLACE INTO
mungkin tidak akan dapat Anda terima, karena menghapus baris lama yang bentrok melalui kunci unik.Seseorang menyarankan sebelum Anda dapat mengurangi mengetik dengan melakukan:
sumber
replace into
permintaan?Tidak ada cara lain, saya harus menentukan semuanya dua kali. Pertama untuk menyisipkan, kedua dalam kasus pembaruan.
sumber
Ini solusi untuk masalah Anda:
Saya sudah mencoba menyelesaikan masalah seperti masalah Anda & saya ingin menyarankan untuk menguji dari aspek sederhana.
Ikuti langkah-langkah ini: Belajar dari solusi sederhana.
Langkah 1: Buat skema tabel menggunakan SQL Query ini:
Langkah 2: Buat indeks dua kolom untuk mencegah duplikat data menggunakan SQL Query berikut:
atau, Buat indeks dua kolom dari GUI sebagai berikut:
Langkah 3: Perbarui jika ada, masukkan jika tidak menggunakan pertanyaan berikut:
sumber
Jika Anda dapat menggunakan bahasa skrip untuk menyiapkan kueri SQL, Anda bisa menggunakan kembali pasangan bidang = nilai dengan menggunakan
SET
alih-alih(a,b,c) VALUES(a,b,c)
.Contoh dengan PHP:
Tabel contoh:
sumber
Anda mungkin ingin mempertimbangkan untuk menggunakan
REPLACE INTO
sintaks, tetapi berhati-hatilah, pada duplikat kunci PRIMARY / UNIK, itu MENGHAPUS baris dan SERI yang baru.Anda tidak perlu menentukan ulang semua bidang. Namun, Anda harus mempertimbangkan pengurangan kinerja yang mungkin (tergantung pada desain meja Anda).
Peringatan:
sumber
Saya tahu ini sudah terlambat, tetapi saya berharap seseorang akan terbantu dengan jawaban ini
Anda dapat membaca tutorial di bawah ini di sini:
sumber
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
Anda dapat menggunakan sisipkan abaikan untuk kasus seperti itu, itu akan diabaikan jika mendapat catatan duplikat SISIPKAN LUAR BIASA ...; - tanpa KUNCI DUPLIKASI
sumber