【问题标题】:Creating a BEFORE INSERT TRIGGER IN MYSQL在 MYSQL 中创建 BEFORE INSERT TRIGGER
【发布时间】:2017-03-24 02:36:37
【问题描述】:

我需要帮助在 mySQL Bench 上创建 BEFORE INSERT TRIGGER。请问我是新手。

CREATE TABLE `quincyninying`.`toytracking` (
`Toyid` INT NOT NULL,
`ToyName` VARCHAR(50) NULL,
`Toycost` DECIMAL NULL,
`ToyAction` VARCHAR(50) NULL,
`ActionDate` DATETIME NULL,
 PRIMARY KEY (`Toyid`));

CREATE TABLE `quincyninying`.`toy` (
`Toyid` INT NOT NULL,
`ToyName` VARCHAR(50) NULL,
`Toycost` DECIMAL NULL,
PRIMARY KEY (`Toyid`));

在 toy 表上创建一个 BEFORE INSERT 触发器,该触发器将记录添加到 toytracking 表中,其中包含正在插入的 toy 表记录中的信息,硬编码的 ToyAction 将是“INSERT”以及记录的当前日期和时间被插入。

ERROR 1054: Unknown column 'inserted' in 'NEW' SQL Statement:
CREATE DEFINER = CURRENT_USER TRIGGER `quincyninying`.`toy_BEFORE_INSERT` BEFORE INSERT ON `toy` 
FOR EACH ROW
BEGIN
    IF new.inserted THEN
        SET @toyaction = 'DELETE';
    ELSE 
        SET @toyaction = 'NEW';
    END IF;

    INSERT INTO `quincyninying`.`toytracking` (toyId, ToyName, ToyCost,     Toyaction, ActionDate)
    VALUES       (new.toyid, new.Toyname, new.Toycost,@Toyaction, now());

END

它给我一个错误提示“错误 1054:‘新’中的未知列‘插入’”

【问题讨论】:

  • 很清楚。 TOY 表上没有名为“已插入”的列。你想达到什么目标?而且,您的桌子设计并不常见。这两个表之间有冗余信息。
  • 我想在 toy 表上添加一个 BEFORE INSERT 触发器,该触发器将一条记录添加到 toytracking 表中,其中包含正在插入的玩具表记录中的信息,硬编码的 ToyAction 将是“INSERT”和插入记录的当前日期和时间。
  • IF new.inserted 应该测试什么?
  • 问题说ToyAction应该是INSERT。但是您的触发器将其设置为 DELETE 或 NEW,具体取决于对不存在列的测试。

标签: mysql


【解决方案1】:

摆脱IF new.inserted 测试,因为没有具有该名称的列,只需将INSERT 硬编码为您在要求中所述的ToyAction 列的值。

CREATE DEFINER = CURRENT_USER TRIGGER `quincyninying`.`toy_BEFORE_INSERT` BEFORE INSERT ON `toy` 
FOR EACH ROW
BEGIN
    INSERT INTO `quincyninying`.`toytracking` (toyId, ToyName, ToyCost, Toyaction, ActionDate)
    VALUES (new.toyid, new.Toyname, new.Toycost, 'INSERT', now());
END

【讨论】:

  • 谢谢你 Barmar。这与 SQL 完全不同。我是 MySQL 新手。如果它是 BEFORE UPDATE 触发器,你能给我一个例子吗?谢谢!
  • @Barmar ...我也陷入了类似的情况..我们是否可以选择删除BEFORE INSERT TRIGGER中的列值。就像在这个例子中我们可以删除new.inserted 吗?
【解决方案2】:

试试这个:

DELIMITER $$

CREATE
    TRIGGER toy_before_insert BEFORE INSERT 
    ON toy
    FOR EACH ROW BEGIN
        IF NEW.Toyaction THEN
            SET @Toyaction = 'DELETE';
        ELSE
            SET @Toyaction = 'NEW';
        END IF;

        INSERT INTO toytracking (toyId, ToyName, ToyCost, Toyaction, ActionDate) VALUES (NEW.Toyid, NEW.ToyName, NEW.ToyCost, @Toyaction, NOW());

END$$

DELIMITER ;

【讨论】:

  • 他为什么要试一试? NEW.deleted 是什么? toy 表中没有 deleted 列
  • 是的。我现在明白了,这是我的错误。
  • 请帮助它是在 UPDATE 触发器之前吗?谢谢
  • @ninying90 使用ELSEIF 更多关于techonthenet.com/mysql/loops/if_then.php
猜你喜欢
  • 2011-03-16
  • 2011-09-18
  • 2020-02-02
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多