我通过PDO向MySQL插入查询时出现了非常奇怪的错误。
如果此记录在此表中不存在,我希望在表中插入记录。
$query = "INSERT INTO Phrases (KeyText)
SELECT * FROM (SELECT :key_text) as tmp WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)";
try
{
$preparedStatement = $db->prepare($query);
foreach ($phrases as $phrase)
{
$preparedStatement->execute(array(':key_text' => $phrase));
echo "-";
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
抛出异常:在非对象上调用成员函数execute()。
我不明白SQL命令中的错误在哪里。其他代码是正确的,因为当我将SQL命令更改为其他代码时(例如: SELECT:key_text为kt ),它可以正常工作。
感谢您的回答。
更新: 错误是:
[0] => HY000 [1] => 1096 [2] =>没有使用表格
如何为MySQL创建正确的SQL命令? 变体与
INSERT INTO Phrases (KeyText)
SELECT :key_text WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)
在MySQL中也不起作用。
更新2:
INSERT INTO Phrases (KeyText)
SELECT :key_text FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)
这个DUAL表的查询有效!
答案 0 :(得分:5)
您的预备电话失败了,您只是认为它已成功。
尝试
$preparedStatement = $db->prepare($query) or die($db->errorInfo());
抓住错误。
答案 1 :(得分:1)
听起来像prepare
失败了,因此你试图在无效对象上调用execute
(而不是像你期望的那样准备好的语句对象)。检查prepare
的返回值实际上是PDOStatement
对象,而不是FALSE
答案 2 :(得分:1)
INSERT INTO Phrases (KeyText)
SELECT :key_text
WHERE NOT EXISTS (SELECT * FROM Phrases WHERE KeyText = :key_text)
SQL Server - How to insert a record and make sure it is unique
答案 3 :(得分:1)
你的update2应该可行。
ALTERNATIVE :
在字段KeyText上有唯一或主键
ALTER TABLE `Phrases` ADD UNIQUE INDEX (`KeyText`);
然后使用查询:
INSERT IGNORE INTO Phrases (KeyText) VALUES (:key_text);
如果没有记录更改,请检查您是否已自动提交或执行commit
答案 4 :(得分:0)
错误:
insert into table
select * from (select 1 a, 2 b ) t
where not exists(select 1 from t2 where t2.c =2)
右:
insert into table
select * from (select 1 a, 2 b union select 1 a, 2 b) t
where not exists(select 1 from t2 where t2.c =2)