簡體   English   中英

為什么此SQL查詢不起作用?

[英]Why this SQL query does not work?

我寫了這個查詢,但是出現以下錯誤:

致命錯誤:消息為“ SQLSTATE [42000]”的未捕獲的異常“ PDOException”:語法錯誤或訪問沖突: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;

一種更快的替代方法是在useridtopic_id上具有UNIQUE INDEX。

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技巧。

這是實現邏輯的錯誤方法。 如果希望每個用戶和主題一次出現在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 實際上,使用IF只會由於競爭條件而引起問題,並不能真正保證數據庫中的任何內容。

IF NOT EXISTS是可在MS-SQL中使用的子句,但在MySQL中不可用。 請嘗試以下查詢。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM