我正在尝试在PDO脚本中创建查询,以检查记录是否存在,如果查询确实执行了,查询应该更新该记录,如果不存在,则应该创建一个新记录。
该表中仅应存在一次的列不是INDEX键(现在无法使其唯一),因此未将其设置为唯一,因此我无法使用ON DUPLICATE KEY UPDATE
我想在下面使用此查询逻辑使其起作用:
$stmt = $conn->prepare('IF EXISTS (SELECT * FROM `Table1` WHERE `code`= :code )
UPDATE `Table1`
SET `code_stat` = 2
WHERE code = :code
ELSE
INSERT INTO `Table1` (`code`,`code_stat`)
VALUES (:code, 2 ) ' );
$stmt->execute([
'code' => $_POST['code']
]);
问题是执行查询时出现以下错误,提示存在语法问题:
SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near
'IF EXISTS (SELECT * FROM Table1 WHERE code= ? ) UPDATE Table1' at line 1
答案 0 :(得分:1)
如果不能向表添加唯一键,则可以先尝试进行更新,如果不更新任何行,请执行插入操作。像这样:
$stmt = $conn->prepare('UPDATE `Table1` SET `code_stat` = 2 WHERE code = :code');
$stmt->execute(array(':code' => $_POST['code']));
if (!$stmt->rowCount()) {
// no rows updated, so insert
$stmt = $conn->prepare('INSERT INTO `Table1` (`code_stat`, `code`) VALUES (2, :code)');
$stmt->execute(array(':code' => $_POST['code']));
}
请注意,您可能需要设置PDO::MYSQL_ATTR_FOUND_ROWS
属性,以确保UPDATE
查询在找到该行但该值不变的情况下返回1。建立连接时必须设置该属性,例如
$conn = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
答案 1 :(得分:0)
为什么不编写存储过程来处理此问题,如下所示:
DROP PROCEDURE IF EXISTS db.SP_NEW_CODE;
CREATE PROCEDURE db.`SP_NEW_CODE`(IN `in_code` INT)
BEGIN
DECLARE numFound INT DEFAULT 0;
SET numFound=(SELECT * FROM `Table1` WHERE `code`= in_code);
IF (numFound=0) THEN
INSERT INTO `Table1` (`code`,`code_stat`) VALUES (in_code, 2 );
ELSE
UPDATE `Table1` SET `code_stat` = 2 WHERE code = in_code
END IF;
END;
从您的代码中,简单地执行CALL SP_NEWCODE(3); (例如,其中3是适当的代码值)。