2011-03-11 52 views
0

我正在使用Workbench開發MySQL數據庫。我希望兩個從新創建的記錄發送兩個字段到另一個表。然後,我想用第二個表中新創建的數據更新原始表。我一直在尋找與觸發器來實現這一點,除非當然還有一個更好的方法:)我的嘗試是一個故障,當我去上傳它(見下文)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 [email protected]_SQL_MODE; 
    SET [email protected]_FOREIGN_KEY_CHECKS; 
    SET [email protected]_UNIQUE_CHECKS; 

回答

0

爲什麼在表tc_Eventtc_EventTags_ID?這背後的邏輯是什麼?

我的意思是2個表格之間的關係是(我猜):1個事件 - 許多EventTags。這已經通過tc_EventTags.tc_Event_ID這是tc_Event的外鍵實現了。

要回答你的問題:

因爲它是現在,觸發試圖爲插入表事件中的每一行,在表EventTag添加一行。但它會失敗的原因有兩個:

  1. EventTag有2個約束(外鍵)必須滿足觸發插入才能成功。所以,tc_Event_ID是好的,但tc_Tag_ID必須是非空值並引用標記表,但是您提供的值''可能不在表標記中。

編輯:您提供的價值,'',也是CHAR,而應該是INT

  1. 但觸發可能根本不會被啓動,因爲每一次你在表事件中插入一行時,這些制約因素,必須滿足其中之一是它引用EventTag表tc_EventTags_ID。但EventTag表是空的。你看到這裏的循環邏輯嗎?
+0

在回顧這整個數據庫爲第10次,我不知道。但是我在邏輯上發現了一個缺陷,並且爲了那個而去除了它。這是我的第一個數據庫設計,我在飛行中學習,不是最好的方式,但嘿......它發生了。我會更新OG問題。 – khop 2011-03-12 00:06:43