这是我的桌子

 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属性不会自动更新,我应该怎么做?

最佳答案

首先,您需要为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_IDcolorslibrary.ColorID之间设置外键,我还更改了facerecord.colorslibrary_ID列的数据类型以匹配colorslibrary.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:如果您需要从汽车图书馆表中删除任何现有的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脚本。

一旦设置了触发器,当您指定的触发器动作发生时,它将自动执行您指定的动作。在这种情况下,我们告诉数据库“在自动图书馆表中插入后,使用新的facerecord行的CarID自动在carslibrary表中插入一行,以填充facerecord.carslibrary_ID列”。与大多数事情一样,最好的方法就是尝试一下!创建触发器后,手动将新行插入“ carslibrary table. Now look at the data in the facerecord”表中-您应该看到触发器触发已插入的新行。

听起来您将从学习触发器中受益。我推荐MySQL site上的文档,因为此答案比我最初想要的更长!

10-01 06:58