在 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.idScene_id。它被定义为NOT NULL,所以你需要想出逻辑来适当地设置它。

【讨论】:

那么你能告诉我如何为外键实现逻辑吗?我写了这个但仍然没有工作.. CREATE DEFINER = CURRENT_USER TRIGGER Film_industry.Movies_AFTER_INSERT AFTER INSERT ON Movies对于每一行,如果(NEW.genre = 'action')然后插入 Lightning(Lightning_id,type,Lumens_power)值(NEW.id,'directed','5300');万一;结束; 确实没有提供任何信息。 Scene_idLightning 表中设置为NOT NULL,因此在向该表插入行之前,您需要一个值。 Movies 表没有该信息。您应该确定什么决定了适合新电影的Scene_id?如果没有特定值,请从Scene-表中选择一个值并将该 ID 用作插入中的常量。

以上是关于在 MySQL 中编写关于两个表的触发器,具有逻辑的主要内容,如果未能解决你的问题,请参考以下文章

关于sqlserver临时表的问题,请教高手!

关于mysql中触发器old和new

MySQL触发器

对第二个表中不存在 ID 的两个表的 MySQL 查询优化

(10)MySQL触发器(同时操作两张表)

如何在 MYSQL 中编写可以从触发器和存储函数调用的信号函数?