MySql Trigger перед вставкой не работает - PullRequest
2 голосов
/ 22 января 2011

У меня проблемы с созданием триггера BEFORE INSERT.

схема таблицы:

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, который не позволит 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

вышеуказанные данные не допускаются. Поэтому я хочу, чтобы эта таблица была таблицей "set", разрешены следующие данные:

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

Ответы [ 2 ]

2 голосов
/ 04 сентября 2012

Триггеры используются для обеспечения целостности данных и их избежания. используйте триггеры для удаления более двух таблиц. Перед инициализацией триггеров мы временно изменим оператор разделителя 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 всякий раз, когда мы удаляем запись в таблице блогов. Все теги, относящиеся к блогу, будут удалены, а все комментарии, относящиеся к блогу, удалены. Это гарантирует отсутствие нежелательных данных в базе данных. Также процесс автоматический.

( источник )

1 голос
/ 22 января 2011

INSERT ignore () не отменяет вставку и не вызывает ее сбой. Есть несколько способов сделать это, но самый простой - вызвать ошибку:

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

см. ТРИГГЕРЫ, которые вызывают сбой ВСТАВКИ? Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...