【问题标题】:Increment a database field by 1将数据库字段增加 1
【发布时间】:2011-02-15 07:29:08
【问题描述】:

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

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

所以表格可能看起来像这样..

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

John               Jones             1
Steve              Smith             3

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

【问题讨论】:

    标签: mysql insert increment


    【解决方案1】:

    更新条目:

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

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

    插入新行,如果已经存在则更新:

    如果您想更新以前存在的行,或者如果它不存在则插入它,您可以使用REPLACE syntaxINSERT...ON DUPLICATE KEY UPDATE 选项(如Rob Van Damhis answer 中演示的那样)。

    插入一个新条目:

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

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

    【讨论】:

    • 另外,请务必根据您的应用程序添加 WHERE 子句。
    • 哦,真的!我不知道你可以这样做!那么这行得通吗? INSERT IGNORE mytable (firstName, lastName, logins) VALUES (John, Smith, logins = logins + 1)
    • @Matt 不,这是INSERT,而不是UPDATE。如果你想做一个插入,你需要得到最大值并加 1。
    • @Matt 您的问题询问“关于 更新 1”,这导致了混乱。我认为您可能正在寻找另一种解决方案,我已在更新的答案中引用了该解决方案。
    • @Jonathan 很抱歉让您感到困惑.. 我已经更新了我的问题,希望这更清楚..
    【解决方案2】:

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

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

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

    【讨论】:

    • 64+ 字节主键不是一个好建议
    • 会使用变量代替“1”吗?即 ON DUPLICATE KEY UPDATE logins = logins + numLogins; (当然格式正确)
    • 请注意 ON DUPLICATE KEY UPDATE 并非完全安全复制!
    【解决方案3】:

    这更像是上面许多答案的脚注,这些答案建议使用ON DUPLICATE KEY UPDATE注意总是复制安全的,所以如果你曾经计划扩展到单个服务器之外,您会想要避免这种情况并使用两个查询,一个来验证存在,然后第二个查询 either UPDATE 当存在一行时,或者 @ 987654323@ 如果没有。

    【讨论】:

      【解决方案4】:

      您没有说您要做什么,但是您在 cmets 中对其他答案的暗示已经足够好了。我想你可能正在寻找一个自动增量列

      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 的函数。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-31
          • 2015-01-10
          • 1970-01-01
          • 2019-11-22
          • 1970-01-01
          • 1970-01-01
          • 2016-02-13
          • 1970-01-01
          相关资源
          最近更新 更多