2011-10-06 43 views
0

這是我的表mysql如何更新外鍵自動

CREATE TABLE IF NOT EXISTS `carslibrary` (
     `CarID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `CarName` varchar(255) NOT NULL, 
     PRIMARY KEY (`CarID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

    CREATE TABLE IF NOT EXISTS `colorslibrary` (
     `ColorID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
     `ColorName` varchar(255) NOT NULL, 
     PRIMARY KEY (`ColorID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 


    CREATE TABLE IF NOT EXISTS `facerecord` (
     `carslibrary_ID` int(10) unsigned NOT NULL, 
     `colorslibrary_ID` int(11) unsigned NOT NULL, 
     KEY `carslibrary_ID` (`carslibrary_ID`), 
     KEY `colorslibrary_ID` (`colorslibrary_ID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

我注意到facerecord表時,我添加carslibrary表內汽車記錄不會自動更新裏面carslibrary_ID屬性,我應該怎麼做才能夠至?

+1

當您只有1/2的信息時,如何插入carslibrary記錄時如何將記錄自動添加到facerecord。對我來說,facerecord表看起來像汽車 - >顏色的關係表。 – Geoffrey

+0

colorslibrary_ID手動更新,而carslibrary_ID不應該 –

回答

4

首先,你需要有對facerecord.colorslibrary_ID指定的,因爲你不會「知道」是什麼插入carslibrary表時的默認值。這就是說,你可以改變你的DDL facerecord表是:

CREATE TABLE `facerecord` (
`carslibrary_ID` int(10) unsigned NOT NULL, 
`colorslibrary_ID` int(10) unsigned NOT NULL DEFAULT '0', 
KEY `carslibrary_ID` (`carslibrary_ID`), 
KEY `colorslibrary_ID` (`colorslibrary_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

我也改變了colorslibrary_ID列的數據類型以匹配colorslibrary.ColorID列的情況下,你覺得自己要建立一個外鍵在facerecord.colorslibrary_IDcolorslibrary.ColorID之間;)。爲了完整起見,你應該插入一行到colorslibrary表與ColorID = 0。因此:

insert into `colorslibrary` (ColorName) values ('unknown color'); 

update `colorslibrary` set ColorID = 0 where ColorName = 'unknown color'; 

然後你就可以繼續前進,定義觸發插入到facerecord表:

delimiter $$ 

CREATE TRIGGER carslibrary_trigger 
    AFTER insert ON carslibrary 
    FOR EACH ROW 
    BEGIN 
     insert into facerecord (carslibrary_ID) values (new.CarID); 
END$$ 

delimiter; 

插入facerecord表中的所有新行隨後將與該colorslibrary_ID關係到「未知顏色」 colorslibrary.ColorName然後。你可以手動更新facerecord.colorslibrary_ID,當你知道它插入。

祝你好運!

PS。如果你需要先找到現有的觸發器來除去從carslibrary表中的任何現有AFTER insert觸發器,你可以這樣做:

select trigger_name 
from information_schema.triggers 
where event_object_table = 'carslibrary' 
and action_timing = 'AFTER' 
and event_manipulation= 'INSERT'; 

然後乘坐由上面的語句返回的觸發器的名稱(可以讓說回到「carslibrary_trigger」的字符串),然後運行:

drop trigger carslibrary_trigger; 

然後重新運行CREATE TRIGGER腳本。

一旦設置了觸發器,它將自動執行您指定的觸發器操作發生時指定的操作。在這種情況下,我們告訴數據庫「插入carslibrary表後,將自動在facerecord表中插入一行,使用新carslibrary行的CarID填充facerecord.carslibrary_ID列」。與大多數事情一樣,最好的方法就是嘗試一下!一旦你創建了觸發器,手動在'carslibrary table. Now look at the data in the facerecord`表中插入一個新行 - 你會看到一個新的行被觸發器觸發插入。

聽起來你會從學習觸發器中受益。我建議在MySQL site上的文檔,因爲這個答案是方式比我第一次打算它要長!

+0

+1非常全面的答案。 – Johan

+0

我該如何使用觸發器?我粘貼在SQL文本區域,我得到的錯誤:MySQL說: #1235 - 此版本的MySQL尚不支持'多個觸發器具有相同的動作時間和一個表的事件' –

+0

聽起來像你已經有一個觸發器設置爲插入carslibrary表。如果你想設置上面的觸發器,你需要放棄這些。我已經修改了我的答案,爲您提供了更多信息。 –