我知道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行
感谢您的帮助。 :)
答案 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;