2011-01-22 8 views
2

У меня возникли проблемы с созданием триггера ДО НАЧАЛА ВСТАВКИ.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 

Моя неудавшаяся попытка создать ПЕРЕД ВСТАВИТЬ триггер, который не позволит linkFrom и linkTo равным друг с другом. Эта таблица 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

ВСТАВИТЬ игнорировать() не отменяет вставку или привести к сбою. Есть несколько способов сделать это, но проще всего вызвать ошибку:

... 
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. Поскольку триггеры используют оператор semicolon (;) для нескольких команд 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)