2011-01-22 77 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