在 MySQL 中编写关于两个表的触发器,具有逻辑
Posted
技术标签:
【中文标题】在 MySQL 中编写关于两个表的触发器,具有逻辑【英文标题】:Writing trigger in MySQL regarding two tables, with logic 【发布时间】:2022-01-12 20:35:43 【问题描述】:当我编写下面提到的触发器时,我收到错误“此处不应插入”
Tables 电影,Lightning 与关联表是多对多关系。
我的目标是当电影表“流派”属性等于“动作”时,将“闪电”表中的 Lumens_power 设置为 5300。
CREATE DEFINER = CURRENT_USER TRIGGER `Film_industry`.`Movies_AFTER_INSERT`
AFTER INSERT ON `Movies` FOR EACH ROW
BEGIN
SELECT genre,
CASE WHEN genre = 'action' THEN INSERT INTO Lightning(id, type, Lumens_power) values('NEW.Movies_id', 'directed', '5300');
END;
FROM Movies;
END;
-- -----------------------------------------------------
-- Table `Film_industry`.`Movies`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Film_industry`.`Movies` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`released_on` DATE NOT NULL,
`genre` VARCHAR(40) NOT NULL,
`rating` DECIMAL(2,1) NOT NULL,
`finansial_stake` DECIMAL(11,2) NOT NULL,
`Supporting_object_id` INT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
UNIQUE INDEX `title_UNIQUE` (`title` ASC) VISIBLE,
INDEX `fk_Movies_Supporting_object1_idx` (`Supporting_object_id` ASC) VISIBLE,
CONSTRAINT `fk_Movies_Supporting_object1`
FOREIGN KEY (`Supporting_object_id`)
REFERENCES `Film_industry`.`Supporting_object` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Film_industry`.`Lightning`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Film_industry`.`Lightning` (
`id` INT NOT NULL AUTO_INCREMENT,
`type` VARCHAR(45) NOT NULL,
`Lumens_power` INT NOT NULL,
`Scene_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_Lightning_Scene1_idx` (`Scene_id` ASC) VISIBLE,
CONSTRAINT `fk_Lightning_Scene1`
FOREIGN KEY (`Scene_id`)
REFERENCES `Film_industry`.`Scene` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
【问题讨论】:
【参考方案1】:您可以简单地使用检查genre
列的值
IF (NEW.genre = 'action') then
INSERT...
END;
请注意,Lightning
表还包含引用 Film_industry.Scene.id
的 Scene_id
。它被定义为NOT NULL
,所以你需要想出逻辑来适当地设置它。
【讨论】:
那么你能告诉我如何为外键实现逻辑吗?我写了这个但仍然没有工作.. CREATE DEFINER = CURRENT_USER TRIGGERFilm_industry
.Movies_AFTER_INSERT
AFTER INSERT ON Movies
对于每一行,如果(NEW.genre = 'action')然后插入 Lightning(Lightning_id,type,Lumens_power)值(NEW.id,'directed','5300');万一;结束;
确实没有提供任何信息。 Scene_id
在Lightning
表中设置为NOT NULL
,因此在向该表插入行之前,您需要一个值。 Movies
表没有该信息。您应该确定什么决定了适合新电影的Scene_id
?如果没有特定值,请从Scene
-表中选择一个值并将该 ID 用作插入中的常量。以上是关于在 MySQL 中编写关于两个表的触发器,具有逻辑的主要内容,如果未能解决你的问题,请参考以下文章