将数据库字段加1


158

使用MySQL,如果我有一个字段(例如登录名),我将如何在sql命令中将该字段更新为1?

我正在尝试创建一个INSERT查询,该查询创建firstName,lastName和登录名。但是,如果firstName和lastName的组合已经存在,则将登录数增加1。

因此表格可能看起来像这样。

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

John               Jones             1
Steve              Smith             3

我需要一个命令,该命令在运行时将插入一个新的人(即Tom Rogers),或者如果使用约翰·琼斯的名字则增加登录名。

Answers:


287

更新条目:

一个简单的增量就可以解决问题。

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

插入新行,或更新(如果已存在):

如果您想更新先前存在的行,或者如果不存在则将其插入,则可以使用REPLACE语法INSERT...ON DUPLICATE KEY UPDATE选项(如Rob Van Dam他的回答中所示)。

插入新条目:

也许您正在寻找类似的东西INSERT...MAX(logins)+1?本质上,您将运行类似于以下内容的查询-根据您的特定需求,可能会更复杂一些:

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

3
另外,请确保将WHERE子句添加到适合您的应用程序的位置。
BoltClock

真的吗!!我不知道你能做到!这样行吗?插入IGNORE mytable(名字,姓氏,登录名)值(John,Smith,登录名=登录名+ 1)
Matt

@Matt不,那是an INSERT,不是an UPDATE。如果要插入,则需要获取最大值并加1。
桑普森

2
@Matt您的问题询问“关于将其更新 1”,这引起了混乱。我认为您可能正在寻找另一种解决方案,我在更新后的答案中已经提到了该解决方案。
桑普森

1
@乔纳森·抱歉,我感到困惑。我已经更新了我的问题,希望那会更清楚一些。–
马特

70

如果您可以安全地将(firstName,lastName)设置为PRIMARY KEY或至少在其上放置UNIQUE密钥,则可以执行以下操作:

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

如果您不能做到这一点,那么您就必须先获取主键是什么,所以我认为您无法在一个查询中实现所需的功能。


1
64字节以上的主键不是一个很好的建议
乔恩·布莱克

使用变量代替“ 1”有效吗?即在重复键更新登录名=登录名+ numLogins; (格式正确,当然)
马特2010年

1
注意ON DUPLICATE KEY UPDATE不是完全复制安全的!
oucil

2

您没有说您要做什么,但是您在其他答案的注释中充分暗示了这一点。我认为您可能正在寻找自动递增列

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

则在插入时不需要特殊代码。只是

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

MySQL API具有告诉您在客户端代码中执行此语句时创建了哪些用户ID的功能。


2

我不是MySQL专家,但是您可能应该考虑触发器,例如INSERT。在触发器中,您可以在原始表上运行select查询,如果发现查询,则只需更新“ logins”行而不是插入新值即可。但这一切都取决于您运行的MySQL版本。


2

这是上面许多答案的脚注,它们建议使用ON DUPLICATE KEY UPDATE,因为这并不总是可以复制安全,因此,如果您计划扩展到单个服务器之外,则要避免这种情况并使用两个查询,一个验证的存在,再进行第二次到要么当一个行存在,或者当它没有。 UPDATEINSERT

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.