Bir veritabanı alanı artırmak 1


158

MySQL ile, oturum açma diyelim bir alanım varsa, bir sql komutu içinde bu alanı 1 ile güncellemeye nasıl devam edebilirim?

FirstName, lastName ve logins oluşturur bir INSERT sorgusu oluşturmaya çalışıyorum. Ancak, firstName ve lastName birleşimi zaten varsa, girişleri 1 oranında artırın.

böylece tablo şöyle görünebilir ..

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

John               Jones             1
Steve              Smith             3

Çalıştırıldığında, John Jones kullanılan ad olsaydı yeni bir kişi (yani Tom Rogers) ekleyebilir veya girişleri artıracak bir komuttan sonrayım.

Yanıtlar:


288

Bir girişi güncelleme:

Basit bir artış hile yapmalıdır.

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

Yeni satır ekleyin veya zaten mevcutsa Güncelle:

Önceden var olan bir satırı güncellemek veya henüz mevcut değilse eklemek isterseniz, REPLACEsözdizimini veya INSERT...ON DUPLICATE KEY UPDATEseçeneği kullanabilirsiniz ( Rob Van Dam'ın cevabında gösterildiği gibi ).

Yeni bir giriş ekleme:

Ya da belki böyle bir şey INSERT...MAX(logins)+1mi arıyorsunuz? Esasen aşağıdakine benzer bir sorgu çalıştırırsınız - belki de özel ihtiyaçlarınıza bağlı olarak biraz daha karmaşık:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
Ayrıca, WHERE yan tümcesini uygulamanıza uygun şekilde eklediğinizden emin olun.
BoltClock

Gerçekten!! Bunu yapabileceğinin farkında değildim !!! Peki bu işe yarar mı? IGNORE INStable ekle (firstName, lastName, logins) DEĞERLER (John, Smith, logins = logins + 1)
Matt

@Matt Hayır, bu bir INSERT, değil UPDATE. Bir kesici uç yapmak istiyorsanız, maksimumu almanız ve buna 1 eklemeniz gerekir.
Sampson

2
@Matt Sorunuz karışıklığa neden olan "bunu 1 ile güncelleme hakkında" sordu . Güncel cevabımda referansta bulunduğum başka bir çözüm arıyor olabileceğinizi düşünüyorum.
Sampson

1
@Jonathan Karışıklık için özür dilerim .. Sorumu güncelledim, umarım biraz daha açıktır ..
Matt

70

PRIMARY KEY'i güvenli bir şekilde (firstName, lastName) yapabilir veya en azından bunlara UNIQUE anahtarı koyabilirseniz, bunu yapabilirsiniz:

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

Bunu yapamazsanız, o zaman birincil anahtarın ne olursa olsun getirmeniz gerekir, bu yüzden tek bir sorguda istediğinizi elde edebileceğinizi sanmıyorum.


1
64+ bayt birincil anahtar harika bir öneri değil
Jon Black

'1' yerine değişken bir çalışma kullanılır mı? yani ÜZERİNDE ANAHTAR TESLİM GÜNCELLEME logins = logins + numLogins; (elbette doğru biçimlendirilmiş)
Matt

1
ON DUPLICATE KEY UPDATETamamen çoğaltma güvenli değildir sakının !
oucil

2

Ne yapmaya çalıştığınızı söylemediniz, ama diğer cevaba yapılan yorumlarda yeterince iyi ima ettiniz. Sanırım muhtemelen bir otomatik artış sütunu arıyorsunuz

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

ekte özel bir kod gerekmez. Sadece

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

MySQL API'sı, bu ifadeyi istemci kodunda yürüttüğünüzde hangi kullanıcı kimliğinin oluşturulduğunu size söyleyecek işlevlere sahiptir.


2

Ben MySQL uzman değilim ama muhtemelen tetikleyiciler bakmak gerekir örn. INSERT ÖNCE. Tetikleyicide orijinal tablonuzda select sorgusu çalıştırabilirsiniz ve bir şey bulursa yeni değerler eklemek yerine 'logins' satırını güncelleyin. Ancak tüm bunlar, çalıştırdığınız MySQL sürümüne bağlıdır.


2

Bu yukarıda kullanımını önermek cevapları bir dizi daha bir dipnot olduğu ON DUPLICATE KEY UPDATE, dikkat bu olduğunu DEĞİL Hiç tek bir sunucuya ötesinde büyüyen planlıyorsanız, bunu önlemek ve iki sorgu kullanmak isteyeceksiniz bu yüzden, her zaman çoğaltma güvenli bir varlığını doğrulamak ve daha sonra bir ikinci, ya da UPDATE bir satır bulunmaktadır, veya INSERTdeğil yapmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.