为什么这个SQL查询不起作用?

时间:2017-06-03 17:01:52

标签: mysql sql

我写了这个查询,但是我收到以下错误:

  

致命错误:未捕获的异常' PDOException'与消息   ' SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MariaDB服务器版本,用于在BEGIN INSERT附近使用正确的语法   INTO forum_topics_trackuseridtopic_id,`c'在第3行

我想这是自我解释的,但我的目标是检查记录是否存在以及是否存在,以便插入记录。

IF NOT EXISTS 
                (SELECT * FROM `forum_topics_track` WHERE `userid` = '{$userid}' AND `topic_id` = '{$topic_id}') 
            BEGIN
                INSERT INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) 
                VALUES ('{$topic_id}', '{$category_id}', '{$userid}')
            END;

3 个答案:

答案 0 :(得分:1)

更快的替代方案是在useridtopic_id上设置独特的索引。

CREATE UNIQUE INDEX forum_topics_track_ndx ON forum_topics_track(userid, topic_id);

然后你可以做

INSERT IGNORE INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) 
            VALUES ('{$topic_id}', '{$category_id}', '{$userid}');

总是会成功(如果数据已存在则可能无效)。

或者您可以查看ON DUPLICATE KEY UPDATE技巧。

答案 1 :(得分:1)

这是实现逻辑的错误方法。如果您希望每个用户和主题一次显示在<div class="container"> <div class="box lime full"></div> <div class="box dark_blue"></div> <div class="box light_blue fifthish"></div> <div class="box green fifthish"></div> <div class="box red half"></div> <div class="box orange half"></div> <div class="box teal full"></div> </div>中,则让数据库强制执行约束。使用唯一索引或约束很容易:

forum_topics_track

然后,您可以执行插入并忽略或处理错误:

create unique index unq_forum_topics_track_user_topic on forum_topics_track(user_id, topic_id);

逻辑中不需要INSERT INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) VALUES ('{$topic_id}', '{$category_id}', '{$userid}') ON DUPLICATE KEY UPDATE userid = VALUES(userid); 。实际上,使用IF只会因竞争条件而引发问题,并且不能保证数据库中的任何内容。

答案 2 :(得分:0)

IF NOT EXISTS是一个可用于MS-SQL但不能用于MySQL的子句。请尝试以下查询。

// works only if you are using jQuery
element.find('.parent');
// for JQLite, the find method is limited to lookup by tag name:
element.find('div');