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

マイlinkFromlinkToが各別に等しくすることができないであろうBEFORE INSERTトリガーを作成する試みが失敗しました。上記のデータが許可されていません

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

:このテーブル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, 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

トリガは、データの整合性を使用してデータを避けている参照してください。 2つ以上のテーブルを削除するためのトリガーも使用します。初期化の前に、mysqlデリミタ演算子を一時的に変更します。トリガはセミコロン(;)演算子を複数のSQLコマンドに使用するためです。あなたのケースでは

は以下を1つずつコマンドを使用します。

ステップ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

関連する問題