2011-01-22 83 views
2

我在創建BEFORE INSERT觸發器時遇到了問題。MySql在插入之前觸發不起作用

表模式:

CREATE TABLE IF NOT EXISTS `myReferenceTable` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `linkFrom` bigint(20) NOT NULL, 
    `linkTo` bigint(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `linkFrom` (`linkFrom`,`linkTo`), 
    KEY `linkTo` (`linkTo`) 
) ENGINE=InnoDB 

插入數據:

INSERT INTO `myReferenceTable` (`id`, `linkFrom`, `linkTo`) VALUES 
(1, 1, 2), // allowed 
(2, 2, 1); // allowed 

我創造一個BEFORE INSERT觸發器將不允許linkFromlinkTo等於每一個失敗的嘗試。此表articleReferncesTable不能有任何物品指的它自己,

/* This fails */ 
create trigger myReferenceTable_noDuplicate 
BEFORE INSERT 
ON myReferenceTable 
FOR EACH ROW 
BEGIN 
IF NEW.linkFrom = NEW.linkTo 
    insert ignore() 
END IF; 
END; 

實施例:

INSERT INTO `myReferenceTable` (`id`, `linkFrom`, `linkTo`) VALUES 
(3, 1, 1), // should fail 
(4, 2, 2); // should fail 

上述數據是不允許的。所以我想這個表是一個「集」表中的以下數據是正確的:

INSERT INTO `myReferenceTable` (`id`, `linkFrom`, `linkTo`) VALUES 
    (3, 1, 2), // allowed 
    (4, 1, 3); // allowed 

回答

1

INSERT忽略()不會取消插入或導致其失敗。有幾個方法可以做到這一點,但最簡單的就是導致錯誤:

... 
IF NEW.linkFrom = NEW.linkTo 
    DECLARE dummy INT; 
    SELECT LINKFROM_EQUALS_LINKTO INTO dummy FROM links 
    WHERE links.id = new.id; 
END IF; 
... 

看到TRIGGERs that cause INSERTs to fail? Possible?

2

觸發器用於數據完整性和避免數據。也使用觸發器刪除兩個以上的表。在初始化觸發器之前,我們暫時更改mysql分隔符運算符。因爲觸發器使用分號(;)運算符來執行多個sql命令。

在您的情況使用如下命令逐個:

第1步:

更改分隔符,

delimiter $$ 

第2步:

創建觸發器,

CREATE TRIGGER `blog_before_delete`  
    AFTER DELETE ON `blog`  
    FOR EACH ROW  
BEGIN 
    DELETE FROM blog_tags where blogid = OLD.id; 
     DELETE FROM blog_comments where blogid = OLD.id; 
END 
$$ 

第3步:

恢復符,

delimiter ; 

說明:

這裏OLD是一個關鍵字,是指我們要刪除博客錶行。只要我們刪除博客表中的條目,Mysql就會觸發blogbeforedelete。所有與博客相關的標籤都將被刪除,並且與博客相關的所有評論都將被刪除。這確保數據庫中不存在不需要的數據。該過程也是自動的。

source