MySQL触发器 - 实现问题

时间:2011-03-11 23:16:21

标签: mysql sql triggers

我正在使用Workbench开发MySQL数据库。我想要两个从新创建的记录发送两个字段到另一个表。然后,我想用第二个表中新创建的数据更新原始表。我当时希望用触发器实现这个,除非有更好的方法当然:)我上传时尝试失败(见下文)

具体来说,我希望tc_Event发送ID& tc_EventTags_ID到tc_EventTags填写tc_Tag_ID& tc_Event_ID。之后我想将tc_EventTags的ID发送回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 :(得分:0)

为什么在表tc_EventTags_ID中添加tc_Event?这背后的逻辑是什么?

我的意思是两个表之间的关系是(我猜):1个事件 - 很多EventTags。这已经由tc_EventTags.tc_Event_ID实现,tc_Eventtc_Event_ID的外键。

回答你的问题:

就像现在一样,Trigger尝试在表Event中插入的每一行,在表EventTag中添加一行。但它有两个原因会失败:

  1. EventTag有2个约束(外键),必须满足这些约束才能使触发的插入成功。因此,tc_Tag_ID是正常的,但''必须为非NULL并引用Tag表,但您提供的值''可能不在表Tag中。
  2. 编辑:您提供的值CHAR也是INT,而应该是tc_EventTags_ID

    1. 但是触发器可能根本不会启动,因为每次在表Event中插入一行时,必须满足这些约束,其中一个是引用EventTag表的{{1}}。但是EventTag表是空的。你在这看到循环逻辑吗?