[英]MySQL Trigger Syntax Error IF Exists
我有一個嘗試創建的MySQL觸發器,但是語法不正確。
觸發器應經過檢查,並使一組關鍵字與插入數據庫中的新帖子的標題相匹配。 如果找到匹配項,則應為該存儲桶分配新帖子,並更新存儲桶關鍵字集。 如果找不到匹配項,則應使用帖子中的值創建一個新存儲桶。 錯誤指向以IF EXISTS開頭的行,但我無法弄清楚出了什么問題。 任何幫助將不勝感激。 謝謝!
更新:代碼已更新為退出IF EXISTS,但現在從ELSE語句開始出現錯誤。
delimiter $$
CREATE TRIGGER bucket_trigger_v1 BEFORE INSERT ON posts
FOR EACH ROW
BEGIN
set @target = NEW.post_title;
set @bucket_id_number = '';
set @bucket_relevance = '';
SELECT idbuckets, MATCH (keywords) AGAINST (@target) AS score INTO @bucket_id_number, @bucket_relevance FROM buckets WHERE MATCH (keywords) AGAINST (@target) ORDER BY score DESC LIMIT 1;
IF (@bucket_id_number != '') THEN
BEGIN
SET NEW.buckets_idbuckets = @bucket_id_number;
UPDATE buckets SET keywords = concat(keywords, @target) WHERE idbuckets = @bucket_id_number;
END
ELSE
BEGIN
INSERT INTO buckets (idbuckets, keywords, creationdate) VALUES (, @target, NEW.postdate);
SET NEW.bucket_idbuckets = (SELECT LAST_INSERT_ID());
END
END IF;
END;
$$
有兩點要考慮:
嵌套SELECT中不應使用INTO子句,因為這樣的SELECT必須將其結果返回到外部上下文。
這樣的SET語句在AFTER觸發器中無效,因為行更改已經發生。
UPDATE
以下代碼正確創建了觸發器。 僅為了創建觸發器而創建posts
表。
/*Table structure for table `posts` */
DROP TABLE IF EXISTS `posts`;
CREATE TABLE `posts` (
`post_title` VARCHAR(500) DEFAULT NULL,
`buckets_idbuckets` INT(11) DEFAULT NULL,
`postdate` DATETIME DEFAULT NULL
) ENGINE=INNODB;
/* Trigger structure for table `posts` */
DELIMITER $$
/*!50003 DROP TRIGGER*/ /*!50032 IF EXISTS */ /*!50003 `bucket_trigger_v1` */$$
CREATE TRIGGER `bucket_trigger_v1` BEFORE INSERT ON `posts`
FOR EACH ROW
BEGIN
SET @target := new.`post_title`;
SET @bucket_id_number := '';
SET @bucket_relevance := '';
SELECT `idbuckets`, MATCH (`keywords`) AGAINST (@target) AS `score` INTO @bucket_id_number, @bucket_relevance FROM `buckets` WHERE MATCH (`keywords`) AGAINST (@target) ORDER BY `score` DESC LIMIT 1;
IF (@bucket_id_number != '') THEN
SET new.`buckets_idbuckets` := @bucket_id_number;
UPDATE `buckets` SET `keywords` = CONCAT(`keywords`, @target) WHERE `idbuckets` = @bucket_id_number;
ELSE
INSERT INTO `buckets` (`keywords`, `creationdate`) VALUES (@target, new.`postdate`);
SET new.`buckets_idbuckets` := LAST_INSERT_ID();
END IF;
END$$
DELIMITER ;
MySQL,或者至少我正在運行的版本,不能一次處理多個觸發器。 由於這個原因,IF語句不適用於BEGIN和END,因此我必須找到其他解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.