Триггеры MySQL - проблема реализации - PullRequest
0 голосов
/ 12 марта 2011

Я занимаюсь разработкой базы данных MySQL с использованием Workbench. Я хочу, чтобы два отправили два поля из вновь созданной записи в другую таблицу. Затем я хотел бы обновить исходную таблицу вновь созданными данными из второй таблицы. Я искал, чтобы реализовать это с помощью триггеров, если, конечно, нет лучшего способа :) Моя попытка потерпела неудачу, когда я пошел, чтобы загрузить его (см. Ниже)

В частности, я бы хотел, чтобы tc_Event отправлял идентификатор & tc_EventTags_ID в tc_EventTags для заполнения tc_Tag_ID & tc_Event_ID. После этого я хочу, чтобы идентификатор tc_EventTags был отправлен обратно в tc_Event в поле tc_EventTags_ID.

Спасибо за любую помощь.

-- -----------------------------------------------------
-- Table `mcontest`.`tc_EventTags`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mcontest`.`tc_EventTags` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `tc_Tag_ID` INT NOT NULL ,
  `tc_Event_ID` INT NOT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `fk_tc_EventTags_tc_Tag1` (`tc_Tag_ID` ASC) ,
  INDEX `fk_tc_EventTags_tc_Event1` (`tc_Event_ID` ASC) ,
  CONSTRAINT `fk_tc_EventTags_tc_Tag1`
    FOREIGN KEY (`tc_Tag_ID` )
    REFERENCES `mcontest`.`tc_Tag` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_tc_EventTags_tc_Event1`
    FOREIGN KEY (`tc_Event_ID` )
    REFERENCES `mcontest`.`tc_Event` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = MyISAM;

-- -----------------------------------------------------
-- Table `mcontest`.`tc_Event`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mcontest`.`tc_Event` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `date` DATE NOT NULL ,
  `time` TIME NOT NULL ,
  `location` VARCHAR(45) NOT NULL ,
  `description` VARCHAR(45) NOT NULL ,
  `tc_EventTags_ID` INT NULL ,
  `tc_Orgs_ID` INT NOT NULL ,
  `tc_PersonEvent_ID` INT NOT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `fk_tc_Event_tc_EventTags1` (`tc_EventTags_ID` ASC) ,
  INDEX `fk_tc_Event_tc_Orgs1` (`tc_Orgs_ID` ASC) ,
  INDEX `fk_tc_Event_tc_PersonEvent1` (`tc_PersonEvent_ID` ASC) ,
  CONSTRAINT `fk_tc_Event_tc_EventTags1`
    FOREIGN KEY (`tc_EventTags_ID` )
    REFERENCES `mcontest`.`tc_EventTags` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_tc_Event_tc_Orgs1`
    FOREIGN KEY (`tc_Orgs_ID` )
    REFERENCES `mcontest`.`tc_Orgs` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_tc_Event_tc_PersonEvent1`
    FOREIGN KEY (`tc_PersonEvent_ID` )
    REFERENCES `mcontest`.`tc_PersonEvent` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = MyISAM;


    USE `mcontest`;

    DELIMITER $$
    USE `mcontest`$$


    CREATE TRIGGER eventTag_Trigger
    AFTER insert ON tc_Event

    FOR EACH ROW BEGIN 
    INSERT INTO tc_EventTags values('',NEW.tc_Event_ID);
    END;


    END$$


    DELIMITER ;


    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

1 Ответ

0 голосов
/ 12 марта 2011

Почему положили tc_EventTags_ID в таблицу tc_Event?Какая логика стоит за этим?

Я имею в виду, что отношения между двумя таблицами будут (я думаю): 1 Event - много EventTags.Это уже достигается с помощью tc_EventTags.tc_Event_ID, который является внешним ключом для tc_Event.

. Чтобы ответить на ваш вопрос:

Как и сейчас, триггер пытается выполнить каждую строку, вставленную в таблицу.Событие, чтобы добавить строку в таблицу EventTag.Но произойдет сбой по двум причинам:

  1. EventTag имеет 2 ограничения (внешние ключи), которые должны быть выполнены для успешной вставки триггера.Итак, tc_Event_ID в порядке, но tc_Tag_ID должен быть NOT NULL и ссылаться на таблицу тегов, но указанное вами значение, '', вероятно, отсутствует в теге таблицы.

РЕДАКТИРОВАТЬ: значение, которое вы вводите, '', также является CHAR, в то время как оно должно быть INT.

  1. Но триггер, вероятно, не будет запускаться вообще, так как каждый разВы вставляете строку в таблицу Event, эти ограничения должны быть выполнены, и одним из них является tc_EventTags_ID, который ссылается на таблицу EventTag.Но таблица EventTag пуста.Вы видите здесь круговую логику?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...