【问题标题】:Writing trigger in MySQL regarding two tables, with logic在 MySQL 中编写关于两个表的触发器,具有逻辑
【发布时间】: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;


【问题讨论】:

    标签: mysql triggers logic


    【解决方案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 用作插入中的常量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多