【问题标题】:SQL: If exists, update else insertSQL:如果存在,则更新否则插入
【发布时间】:2014-10-23 16:45:25
【问题描述】:

我对 SQL 和 PHP 非常陌生,但如果用户的 ip 不存在条目,我想将用户添加到列表中。如果条目确实存在,我只想更新他们的用户名。

我可以在“如果存在”语句之外执行这两个操作而不会打嗝,但它显然会产生很多重复。当我将其包装在“如果存在”语句中时,查询将停止执行任何操作。

我知道关于这个主题有几个问题,但我已尝试遵循大多数建议,如果有其他方法可以做到这一点,我很乐意考虑,谢谢。

<?php
$username = strval($_GET['username']);
$userip = $_SERVER['REMOTE_ADDR'];

$con = mysqli_connect("localhost", "ramendev_jctwood", "M1n1flam3", "ramendev_jctwood") or die ("Failed to connect to MySQL: " . mysqli_connect_error());

mysqli_query($con, "IF EXISTS (SELECT 1 FROM Users WHERE Userip='$userip')
                        UPDATE Users SET User='$username' WHERE Userip='$userip'
                    ELSE
                        INSERT INTO Users (User, Userip) VALUES ('$username', '$userip')
                            ");
?>

【问题讨论】:

  • 为什么不insert ... on duplicate key update?你为什么不检查sql错误? mysqli_query(...) or die(mysqli_error()) 会告诉你到底出了什么问题。
  • 尝试在 UPDATE 行的末尾和 INSERT 行的末尾添加一个分号。
  • 许多 SQL DBMS 都有扩展来处理这个问题。我不确定哪个提供@Marc B 的on duplicate key update,但SQLite 有insert or replace into,我敢肯定还有其他变体。
  • @john:这是 mysql,OP 显然正在使用它,因为他有 mysqli_query()
  • SQL standard UPSERT call的可能重复

标签: javascript php html sql


【解决方案1】:

你可以试试这个:

IF (SELECT COUNT(*) FROM Users WHERE Userip='$userip') > 0
    UPDATE Users SET User='$username' WHERE Userip='$userip'
ELSE
    INSERT INTO Users (User, Userip) VALUES ('$username', '$userip')

【讨论】:

    【解决方案2】:

    在 mysql 中你可以使用 REPLACE 命令。

    REPLACE INTO users set User='$username' , Userip='$userip'
    

    字段 Userip 必须是主键的唯一索引

    查看更多 http://dev.mysql.com/doc/refman/5.5/en/replace.html

    【讨论】:

      【解决方案3】:

      试试这个

      $query = "SELECT * FROM Users WHERE Userip='$userip'";
      $check = mysql_query($query);
      if(mysql_num_rows($check)) {
         $existdata = mysql_fetch_array($check);
         $newquery = "UPDATE Users SET User='$username' WHERE Userip='{$existdata['Userip']}'";
      } else {
         $newquery = "INSERT INTO Users (User, Userip) VALUES ('$username', '$userip')";       
      }
      $execute = mysql_query($new_query);
      if($execute){
         echo "Success";
      } else {
         echo mysql_error();
      }
      

      【讨论】:

        【解决方案4】:

        以下是当您拥有主键 http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html 时文档告诉我们的情况:

        INSERT INTO table (a,b,c) VALUES (1,2,3)
          ON DUPLICATE KEY UPDATE c=c+1;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-14
          • 1970-01-01
          • 1970-01-01
          • 2022-07-06
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          相关资源
          最近更新 更多