繁体   English   中英

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

[英]Update if row exists, otherwise insert new row into another table

我知道这个问题,但没有帮助。

我有一个包含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语法有错误; 在第1行的'IF NOT EXISTS(SELECT * FROM wcf1_user WHERE steamID = 1)THEN INSERT IN'附近检查与您的MySQL服务器版本相对应的手册以使用正确的语法

谢谢你的帮助。 :)

如果您指定ON 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;

这是域逻辑,不属于数据层。 用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();
?>

我认为您在插入语句的末尾缺少分号,请尝试以下操作,

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM