PHP PDO INSERT WHERE NOT EXISTS语句不起作用

时间:2012-11-14 16:19:00

标签: php mysql pdo

我通过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表的查询有效!

5 个答案:

答案 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)