簡體   English   中英

如果存在MySQL觸發器語法錯誤

[英]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;

$$

有兩點要考慮:

13.2.9.1。 SELECT ... INTO語法

嵌套SELECT中不應使用INTO子句,因為這樣的SELECT必須將其結果返回到外部上下文。

19.3.1。 觸發器語法和示例

這樣的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.

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