Tambahkan bidang basis data dengan 1

158

Dengan MySQL, jika saya memiliki bidang, tentu saja login, bagaimana cara memperbarui bidang tersebut dengan 1 dalam perintah sql?

Saya mencoba membuat kueri INSERT, yang membuat nama depan, nama belakang dan login. Namun jika kombinasi firstName dan lastName sudah ada, tambahkan login dengan 1.

jadi meja mungkin terlihat seperti ini ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

Saya mengejar sebuah perintah yang ketika dijalankan, akan memasukkan orang baru (yaitu Tom Rogers) atau kenaikan login jika John Jones adalah nama yang digunakan ..

Mat
sumber

Jawaban:

288

Memperbarui entri:

Peningkatan sederhana harus melakukan trik.

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

Masukkan baris baru, atau Perbarui jika sudah ada:

Jika Anda ingin memperbarui baris yang sudah ada sebelumnya, atau menyisipkannya jika belum ada, Anda dapat menggunakan REPLACEsintaks atau INSERT...ON DUPLICATE KEY UPDATEopsi (Seperti diperlihatkan Rob Van Dam dalam jawabannya ).

Memasukkan entri baru:

Atau mungkin Anda sedang mencari sesuatu seperti INSERT...MAX(logins)+1? Pada dasarnya Anda akan menjalankan kueri seperti yang berikut - mungkin sedikit lebih rumit tergantung pada kebutuhan spesifik Anda:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
Sampson
sumber
3
Juga, pastikan untuk menambahkan klausa WHERE Anda yang sesuai dengan aplikasi Anda.
BoltClock
Oh benarkah!! Saya tidak sadar Anda bisa melakukan itu !!! Apakah ini akan berhasil? INSERT IGNORE mytable (firstName, lastName, login) VALUES (John, Smith, login = login + 1)
Matt
@ Mat Tidak, itu INSERT, bukan UPDATE. Jika ingin melakukan penyisipan, Anda harus mendapatkan maks dan menambahkan 1 ke dalamnya.
Sampson
2
@Matt Pertanyaan Anda bertanya "tentang memperbarui itu oleh 1" yang menyebabkan kebingungan. Saya pikir Anda mungkin mencari solusi lain, yang telah saya rujuk dalam jawaban saya yang diperbarui.
Sampson
1
@Jonathan Maaf atas kebingungannya .. Saya sudah memperbarui pertanyaan saya, semoga itu sedikit lebih jelas ..
Matt
70

Jika Anda dapat dengan aman membuat (firstName, lastName) KUNCI UTAMA atau setidaknya memasukkan kunci UNIQUE pada mereka, maka Anda bisa melakukan ini:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

Jika Anda tidak bisa melakukan itu, maka Anda harus mengambil apa pun kunci utama itu terlebih dahulu, jadi saya tidak berpikir Anda bisa mencapai apa yang Anda inginkan dalam satu permintaan.

Rob Van Dam
sumber
1
64+ byte primary key bukan saran yang bagus
Jon Black
Apakah menggunakan variabel berfungsi sebagai pengganti '1'? yaitu ON DUPLICATE UPDATE KUNCI login = login + numLogins; (diformat dengan benar tentu saja)
Matt
1
Waspadalah agar ON DUPLICATE KEY UPDATEreplikasi tidak sepenuhnya aman!
oucil
2

Anda tidak mengatakan apa yang Anda coba lakukan, tetapi Anda mengisinya dengan cukup baik di komentar untuk jawaban yang lain. Saya pikir Anda mungkin mencari kolom kenaikan otomatis

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

maka tidak diperlukan kode khusus pada saat memasukkan. Hanya

insert into logins (username, password) values ('user','pass');

API MySQL memiliki fungsi untuk memberi tahu Anda apa yang dibuat userid ketika Anda menjalankan pernyataan ini dalam kode klien.

Ken Bloom
sumber
2

Saya tidak ahli dalam MySQL tetapi Anda mungkin harus melihat pemicu misalnya SEBELUM INSERT. Di pemicu, Anda dapat menjalankan kueri pemilihan pada tabel asli Anda dan jika menemukan sesuatu, perbarui saja baris 'login' daripada memasukkan nilai baru. Tetapi semua ini tergantung pada versi MySQL yang Anda jalankan.

Serg Gulko
sumber
2

Ini lebih merupakan catatan kaki untuk sejumlah jawaban di atas yang menyarankan penggunaan ON DUPLICATE KEY UPDATE, WASPADALAH bahwa ini TIDAK selalu replikasi aman, jadi jika Anda berencana untuk tumbuh melampaui satu server, Anda akan ingin menghindari ini dan menggunakan dua pertanyaan , satu untuk memverifikasi keberadaan, dan kemudian kedua untuk baik UPDATE ketika berturut-turut ada, atau INSERTketika tidak.

oucil
sumber