174

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

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

所以桌子可能看起来像这样..

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

John               Jones             1
Steve              Smith             3

我正在执行一个命令,该命令在运行时会插入一个新人(即 Tom Rogers),或者如果使用的名称是 John Jones 则增加登录次数。

4

5 回答 5

325

更新条目:

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

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
于 2010-05-04T04:41:22.420 回答
74

如果您可以安全地使 (firstName, lastName) 成为 PRIMARY KEY 或至少在它们上放置一个 UNIQUE 键,那么您可以这样做:

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

如果你不能这样做,那么你必须首先获取那个主键,所以我认为你不能在一个查询中实现你想要的。

于 2010-05-04T05:19:35.640 回答
3

这更像是上面许多建议使用的答案的脚注ON DUPLICATE KEY UPDATE请注意这并不总是复制安全的,因此如果您计划超越单个服务器,您将希望避免这种情况并使用两个查询,一个来验证存在,然后第二个来验证行是否存在。 UPDATEINSERT

于 2017-01-31T17:23:20.120 回答
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 的功能。

于 2010-05-04T05:06:38.590 回答
2

我不是 MySQL 专家,但您可能应该查看触发器,例如 BEFORE INSERT。在触发器中,您可以在原始表上运行选择查询,如果发现某些内容,只需更新“登录”行,而不是插入新值。但这一切都取决于您运行的 MySQL 版本。

于 2010-05-04T05:30:53.387 回答