使用MySQL,如果我有一个字段,比如登录,我如何在sql命令中将该字段更新为1?
我正在尝试创建一个INSERT查询,它创建firstName,lastName和logins。但是,如果firstName和lastName的组合已存在,则将登录增加1。
因此表格看起来像这样..
firstName----|----lastName----|----logins
John Jones 1
Steve Smith 3
我正在执行一个命令,在运行时会插入一个新人(即Tom Rogers)或增加登录,如果John Jones是使用的名称..
答案 0 :(得分:258)
一个简单的增量就可以了。
UPDATE mytable
SET logins = logins + 1
WHERE id = 12
如果您要更新以前存在的行,或者如果它尚不存在则插入它,您可以使用REPLACE
syntax或INSERT...ON DUPLICATE KEY UPDATE
选项(如Rob Van Dam所示在his answer)。
或许您正在寻找类似INSERT...MAX(logins)+1
的内容?从本质上讲,您运行的查询与以下内容非常相似 - 根据您的具体需求,可能会更复杂一些:
INSERT into mytable (logins)
SELECT max(logins) + 1
FROM mytable
答案 1 :(得分:68)
如果您可以安全地创建(firstName,lastName)PRIMARY KEY或至少在其上放置一个UNIQUE键,那么您可以这样做:
INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;
如果你不能这样做,那么你必须先获取主键的所有内容,所以我认为你不能在一个查询中实现你想要的。
答案 2 :(得分: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具有告诉您在客户端代码中执行此语句时创建的用户标识的功能。
答案 3 :(得分:2)
我不是MySQL的专家,但您可能应该查看触发器,例如插入之前。 在触发器中,您可以在原始表上运行select查询,如果发现某些内容,只需更新行'登录'而不是插入新值。 但这一切都取决于您运行的MySQL版本。
答案 4 :(得分:1)
这是上述一些答案的更多注释,其中建议使用ON DUPLICATE KEY UPDATE
, BEWARE ,这是 NOT 始终是复制安全的,所以如果您计划在单个服务器之外进行扩展,那么您将要避免这种情况并使用两个查询,一个用于验证是否存在,然后是第二个 UPDATE
存在一行,如果不存在则为INSERT
。