我有条件地使用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...
我准备了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问题的问题.
> PDO can only execute one statement at a time
> Same error, seems to be a different source
> PDO variables inside a select followed by a Where
statement
非常感谢!
回答
Phil提供了一种在多个行上应用唯一约束的简单得多的解决方案,这反过来会拒绝在所述行中唯一的新插入的行.这与测试将要插入的行的不存在相反.下面有更多详细信息.
解决方法:
您的查询看起来完全混乱了,尤其是在您的EXISTS子查询中.您正在从票证中选择MyTbl.ColA ???
我的建议是简单地在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;
}
}
}