mysql如何自动更新外键

时间:2011-10-06 05:47:21

标签: mysql relational-database

这是我的表

 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;

我注意到当我在carslibrary表中添加汽车记录时,facerecord表中的carslibrary_ID属性不会自动更新,我该怎么办?

2 个答案:

答案 0 :(得分:4)

首先,您需要为facerecord.colorslibrary_ID指定一个默认值,因为在插入carslibrary表时您不会“知道”它是什么。也就是说你可以将facerecord表的DDL改为:

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_ID和{{1}之间设置外键});为了完整起见,您应该在colorslibrary.ColorID表中插入一行,ColorID = 0.因此:

colorslibrary

然后你可以继续定义你的触发器以插入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当你知道它的时候。

祝你好运!

PS如果你需要从carslibrary表中删除任何现有的facerecord.colorslibrary_ID触发器,你可以先找到现有的触发器来实现:

AFTER insert

然后取上述语句返回的触发器的名称(假设返回字符串'carslibrary_trigger')并运行:

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

然后重新运行drop trigger carslibrary_trigger; 脚本。

设置触发器后,它将自动执行您指定的触发操作发生时指定的操作。在这种情况下,我们告诉数据库“在插入carlibrary表之后,使用新CREATE TRIGGER行的facerecord自动在CarID表中插入一行来填充{{ 1}}列“。与大多数事情一样,最好的方法是尝试它!手动创建触发器后,在“carslibrary carslibrary facerecord”表中插入一个新行 - 您应该看到触发器触发时插入的新行。

听起来你会从学习触发器中受益。我推荐MySQL site上的文档,因为这个答案方式的时间超过了我的预期时间!

答案 1 :(得分:0)