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

MySQL触发器在一个表上工作,但在另一个表上不工作,mysql,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 t

我创建了一个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_课程表返回课程名称的4个字符代码

我尝试在另一个表中执行完全相同的操作,我复制并粘贴触发器,重命名触发器和表(字段名称和类型也相同),但它不起作用:

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    
//
但是,这会导致空值。我尝试用字符串(即tb_Course.Course_name=“string”)替换New.Course_name,这样可以很好地更新静态值,使触发器看起来正常工作,但它与此表中的select语句不匹配,或者没有设置课程代码字段

您是否可以建议进行某种调试来解决这个问题?这让我发疯,我不知道该怎么诊断这个问题


干杯

我不知道第二个触发器出了什么问题

不过,“调试”部分我可能会有所帮助

搜索“网络”将返回允许单步调试的各种软件(付费)。我不想花钱买东西,只想从存储函数过程和触发器内部“打印”语句

快速搜索会让我找到一个已经完成所有工作的人

我刚刚在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');
程序日志输出:

CALL setupProcLog();

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

CALL cleanup('query end');
入口时间连接\u id msg


2014-02-23 12:32:21 5第12行:输入课程代码
2014-02-23 12:32:21 5行22:学习It课程02代码:2
2014-02-23 12:32:21 5第24行:退出课程代码
2014-02-23 12:32:21 5 cleanup()查询结束

好吧,也许有点笨拙,但这将有助于调试“存储”程序


从现在起我将使用它。

你为什么要这样做?如果
course\u name
足以识别
tb\u course
中的唯一记录(这些触发器必须在这种情况下才能工作),则只需将其用作其他表中的外键即可。另外,存储
课程\u代码
也违反了。您好,老实说,因为我不知道外键是什么。。。我草率地自学了我的mysql知识,以使某些东西工作起来。我会读一些关于外键的书,看看这对我是否有帮助。谢谢,我明白你的意思了。我还发现在输入到fields表的数据中有一个错误,导致触发器失败(我没有注意到开头的空白),这就解释了我最初的问题。感谢您的回复,我将做一些调整,并开始使用一些外键,而不是触发器。实际上,许多应用程序使用代理键,例如
课程_code
,而不是自然键,例如
课程_name
(首先,它允许在不更新子表的情况下更改键值):也就是说,为了遵守3NF,您将只在子表中存储
course\u code
,而不存储
course\u name
。这是怎么做到的?通常,应用程序在插入数据时知道相关的
课程代码
,因此在
INSERT
语句中直接将其提供给数据库;如果不知道,你可以用它来得到它。