[英]Why this SQL query does not work?
我寫了這個查詢,但是出現以下錯誤:
致命錯誤:消息為“ SQLSTATE [42000]”的未捕獲的異常“ PDOException”:語法錯誤或訪問沖突:1064 SQL語法有錯誤; 檢查與您的MariaDB服務器版本相對應的手冊以獲取正確的語法,以在'BEGIN INSERT INTO
forum_topics_track
(userid
,topic_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;
一種更快的替代方法是在userid
和topic_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.