如果行存在则更新,否则将新行插入另一个表

时间:2014-05-11 08:13:46

标签: php mysql

我知道this question,但它没有帮助。

我有一个包含ID和值的列表。现在我必须检查我的用户数据库中是否存在id。如果是,则该行将被更新,否则我必须在另一个表(tmp_user)中插入id

编辑:这是我的尝试

IF NOT EXISTS (SELECT * FROM `wcf1_user` WHERE `steamID` = 1) THEN

INSERT INTO `wcf1_points_tmp` (`steamID`, `points`) VALUES (1, 2)

ELSE

// Update stuff......

END IF;

结果:#1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以便使用正确的语法,如果不是EXISTS(SELECT * FROM wcf1_user WHERE steamID = 1)那么插入'在第1行

感谢您的帮助。 :)

3 个答案:

答案 0 :(得分:1)

如果您指定点击DUPLICATE KEY UPDATE,并且插入的行会导致UNIQUE索引或PRIMARY KEY中出现重复值,则UPDATE执行旧行。例如,如果列a声明为UNIQUE并且包含值1,则以下两个语句具有相同的效果:

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

UPDATE table SET c=c+1 WHERE a=1;

答案 1 :(得分:0)

这是域逻辑,不属于数据层。用PHP代替它:

<?php
  // connect to the database
  $DSN = "mysql:dbname=$dbname;charset=utf8";
  $opt = array(PDO::MYSQL_ATTR_FOUND_ROWS => true);
  $dbh = new PDO($DSN, $username, $password, $opt);
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // one assumes you want to perform this operation atomically
  $dbh->beginTransaction();

  // attempt to update the row
  $update = $dbh->prepare('
    UPDATE wcf1_user
    SET    ......
    WHERE  steamID = ?
  ');
  $update->execute(array($steamID));

  // if the update didn't affect any rows
  if (!$update->rowCount()) {
    // insert into another table instead
    $insert = $dbh->prepare('
      INSERT INTO wcf1_points_tmp
        (steamID, points)
      VALUES
        (?, ?)
    ');
    $insert->execute(array($steamID, $points));
  }

  // tada!
  $dbh->commit();
?>

答案 2 :(得分:-1)

我认为你在insert语句的末尾缺少分号,请尝试以下,

IF NOT EXISTS (SELECT * FROM `wcf1_user` WHERE `steamID` = 1) THEN

INSERT INTO `wcf1_points_tmp` (`steamID`, `points`) VALUES (1, 2);

ELSE

// Update stuff...... remember to add semicolon at the end

END IF;