2

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

4

5 回答 5

5

你的准备调用失败了,你只是假设它成功了。

尝试

    $preparedStatement = $db->prepare($query) or die($db->errorInfo());

捕捉错误。

于 2012-11-14T16:23:02.097 回答
2

您的 update2 应该可以工作。

替代品

在字段 KeyText 上具有唯一键或主键

ALTER TABLE `Phrases` ADD UNIQUE INDEX (`KeyText`);

然后使用查询:

INSERT IGNORE INTO Phrases (KeyText) VALUES (:key_text);

关于没有更改是记录器,请检查您是否已启用自动提交或执行commit

于 2012-11-14T17:14:33.550 回答
1

听起来像prepare失败了,因此您尝试调用execute无效对象(而不是您期望的准备好的语句对象)。检查返回值prepare是否实际上是一个PDOStatement对象而不是FALSE

于 2012-11-14T16:22:28.377 回答
1
INSERT INTO Phrases (KeyText)
    SELECT :key_text
WHERE NOT EXISTS (SELECT * FROM Phrases WHERE KeyText = :key_text)

SQL Server - 如何插入记录并确保它是唯一的

于 2012-11-14T16:33:28.657 回答
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)
于 2013-03-01T08:24:33.863 回答