Incremente um campo do banco de dados em 1

158

Com o MySQL, se eu tiver um campo, digamos logins, como eu atualizaria esse campo por 1 dentro de um comando sql?

Estou tentando criar uma consulta INSERT, que cria firstName, lastName e logins. No entanto, se a combinação de firstName e lastName já existir, aumente os logins em 1.

para que a tabela fique assim ..

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

John               Jones             1
Steve              Smith             3

Estou atrás de um comando que, quando executado, inseriria uma nova pessoa (por exemplo, Tom Rogers) ou incrementaria logins se John Jones fosse o nome usado.

Matt
fonte

Respostas:

287

Atualizando uma entrada:

Um incremento simples deve fazer o truque.

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

Inserir nova linha ou Atualizar se já estiver presente:

Se você deseja atualizar uma linha existente anteriormente ou inseri-la se ela ainda não existir, pode usar a REPLACEsintaxe ou a INSERT...ON DUPLICATE KEY UPDATEopção (como Rob Van Dam demonstrou em sua resposta ).

Inserindo uma nova entrada:

Ou talvez você esteja procurando algo parecido INSERT...MAX(logins)+1? Basicamente, você executaria uma consulta como a seguinte - talvez um pouco mais complexa, dependendo de suas necessidades específicas:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
Sampson
fonte
3
Além disso, adicione sua cláusula WHERE conforme apropriado ao seu aplicativo.
BoltClock
Sério!! Eu não sabia que você poderia fazer isso !!! Então isso funcionaria? INSERT IGNORE mytable (nome, sobrenome, logins) VALUES (John, Smith, logins = logins + 1)
Matt
@ Matt Não, isso é um INSERT, não um UPDATE. Se você deseja fazer uma inserção, precisará obter o máximo e adicionar 1 a ela.
Sampson
2
@ Matt Sua pergunta "sobre como atualizar isso por 1", o que causou a confusão. Eu acho que você pode estar procurando outra solução, que eu referenciei na minha resposta atualizada.
Sampson
1
@ Jonathan Desculpe pela confusão .. Eu atualizar a minha pergunta, isso esperamos um pouco mais claro ..
Matt
70

Se você pode criar (firstName, lastName) com segurança a PRIMARY KEY ou pelo menos colocar uma chave UNIQUE nelas, poderá fazer o seguinte:

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

Se você não puder fazer isso, terá que buscar o que quer que seja a chave primária primeiro, então acho que você não conseguiria o que deseja em uma consulta.

Rob Van Dam
fonte
1
64+ byte de chave primária não é um grande sugestão
Jon Preto
Usar uma variável funcionaria no lugar do '1'? ie ON DUPLICATE KEY UPDATE logins = logins + numLogins; (formatado corretamente, é claro)
Matt
1
Cuidado que ON DUPLICATE KEY UPDATEnão é completamente seguro para replicação!
oucil 31/01
2

Você não disse o que está tentando fazer, mas sugeriu isso suficientemente bem nos comentários da outra resposta. Acho que você provavelmente está procurando uma coluna de incremento automático

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

então nenhum código especial é necessário na inserção. Somente

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

A API do MySQL possui funções para informar qual ID do usuário foi criado quando você executa esta instrução no código do cliente.

Ken Bloom
fonte
2

Eu não sou especialista em MySQL, mas você provavelmente deve procurar gatilhos, por exemplo, ANTES DE INSERIR. No gatilho, você pode executar a consulta select na sua tabela original e, se encontrar alguma coisa, atualize a linha 'logins' em vez de inserir novos valores. Mas tudo isso depende da versão do MySQL que você está executando.

Serg Gulko
fonte
2

Esta é mais uma nota de rodapé para várias respostas acima, que sugerem o uso de ON DUPLICATE KEY UPDATE, CUIDADO: isso nem sempre é seguro para replicação; portanto, se você planeja crescer além de um único servidor, evite isso e use duas consultas , um para verificar a existência e, em seguida, um segundo a um ou outro UPDATE quando existe uma linha, ou INSERTquando isso não acontece.

oucil
fonte