我使用PHP PDO命令有条件地将值插入MySQL数据库。条件指出如果要插入的行已存在,请不要插入它。如果它不存在,请插入该行。当我通过PHPmyadmin执行时,代码执行得很好,因此将PDO变量(:a
,:b
)与静态数字交换。
我收到以下错误:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name '0'' in...
PHP代码如下:
我准备了sql语句......
$InsertFoo = $pdo->prepare("
INSERT INTO `MyTbl` (
`ColA`,
`ColB`
)
SELECT * FROM ( SELECT :a, :b ) AS tmp
WHERE NOT EXISTS (
SELECT `MyTbl`.`ColA`
FROM `MyTbl`
WHERE `ColA` = :aa
AND `ColB` = :bb
)
LIMIT 1
");
然后循环遍历数组以反复执行预准备语句。 (数组是使用SimpleXML生成的,因此是->
。如果您不熟悉SimpleXML,只需将$foo->fooA
视为每个循环都会发生变化的变量。)
foreach ($loopme as $foo) {
// query to be executed for ticket insertion
$TicketsToInsert->execute(array(
a => $foo->fooA,
b => $foo->fooB,
aa => $foo->fooA,
bb => $foo->fooB
));
}
非常感谢任何建议:
作为旁注,有许多类似的问题,但我没有找到任何与插入时的PDO问题完全相关的问题。
Where
statement 非常感谢!
回答
Phil提供了更简单的解决方案,即在多行中应用唯一约束,这反过来又会拒绝在所述行中唯一的新插入行。这与测试即将插入的行的不存在相反。更多细节如下。
答案 0 :(得分:3)
您的查询看起来完全搞砸了,尤其是在您的EXISTS
子查询中。您从MyTbl.ColA
???
tickets
我的建议是在MyTbl (ColA, ColB)
上添加一个唯一约束。
ALTER TABLE MyTbl ADD UNIQUE (ColA, ColB);
然后,您的INSERT
将因唯一约束违规而失败,可以在PDOException
中捕获。
$stmt = $pdo->prepare('INSERT INTO MyTbl (ColA, ColB) VALUES (?, ?)');
foreach ($loopme as $foo) {
try {
$stmt->execute([$foo->fooA, $foo->fooB]);
} catch (PDOException $e) {
$errorCode = $stmt->errorInfo()[1];
if ($errorCode == 1586) {
// I think 1586 is the unique constraint violation error.
// Trial and error will confirm :)
} else {
throw $e;
}
}
}
要解决您看到的错误消息...这是因为您没有区分INSERT
表和子查询表。