MySQL触发器在一个表上工作但不在另一个表上

时间:2014-02-23 09:57:52

标签: mysql

我创建了一个mysql触发器来更新插入另一个表中的值:

DROP TRIGGER IF EXISTS `CourseCode`//
CREATE TRIGGER `CourseCode` BEFORE INSERT ON `race`
FOR EACH ROW  BEGIN
SET NEW.Course_Code = (
    SELECT 
        course_code 
    from 
        tb_course 
    where 
        tb_course.course_name = NEW.course_name
)
END
//

这完美无缺。它根据tb_course表返回course_name的4个字符代码。

我正在尝试做的是在另一个表中完全相同的东西,我复制并粘贴触发器并重命名触发器和表(字段名称和类型也相同)但它不起作用:< / p>

DROP TRIGGER IF EXISTS `CourseCode2`//
CREATE TRIGGER `CourseCode2` BEFORE INSERT ON `fields`
FOR EACH ROW 
BEGIN 
SET NEW.Course_Code = (
    SELECT 
        course_code 
    from 
        tb_course 
    where 
        tb_course.course_name = NEW.course_name
)
END    
//

然而,这导致空值。我已经尝试用字符串替换New.Course_name(即tb_course.course_name =“String”)并更新该静态值,因此触发器似乎正在工作但是它不匹配此表中的select语句或它没有设置Course_Code字段......

您可以建议进行任何调试吗?它让我疯了,我不知道该怎么做来诊断这个问题。

干杯

1 个答案:

答案 0 :(得分:0)

我不知道第二个触发器有什么问题。

然而,'调试'部分我可以帮助。

搜索'net'将返回允许单步调试的各种软件(付费)。我想要的只是来自存储的函数过程和触发器内部的'print'语句,而不是为东西付费。

快速搜索引导我到已经完成所有工作的人。

Debugging Stored Procedures in MySql

我刚刚在MySql中进行了设置并尝试了它,它运行正常。

以下是一些示例代码,基于您的触发器和我得到的输出。

DELIMITER $$

USE `testmysql`$$

DROP TRIGGER /*!50032 IF EXISTS */ `CourseCode`$$
CREATE
    /*!50017 DEFINER = 'test'@'localhost' */
    TRIGGER `CourseCode` BEFORE INSERT ON `race` 
    FOR EACH ROW BEGIN
        DECLARE v_course_code INT; 
        DECLARE v_course_title VARCHAR(255);

    CALL procLog("line 12: Entering CourseCode");
    SELECT 
        course_code, course_title
        INTO
        v_course_code, v_course_title
    FROM 
        tb_course 
    WHERE 
        tb_course.course_name = NEW.course_name;

    SET NEW.course_code = v_course_code;

        CALL procLog(CONCAT("line_22: ", v_course_title, " code: ", NEW.course_code));
        CALL procLog("line 24: Exiting CourseCode");
    END;
$$

DELIMITER ;

<强>查询:

CALL setupProcLog();

INSERT INTO `race` (course_name, race_info)
VALUES ('learn_it_02', 'this is another test');

CALL cleanup('query end');

procLog输出:

entrytime connection_id msg


2014-02-23 12:32:21 5第12行:进入CourseCode
2014-02-23 12:32:21 5 line_22:Learn It Course 02 code:2
2014-02-23 12:32:21 5第24行:退出CourseCode
2014-02-23 12:32:21 5 cleanup()查询结束

好吧,可能有点笨拙,但它有助于调试“存储”程序。

我将从现在开始使用它。