MySQL触发器在一个表上工作,但在另一个表上不工作
我创建了一个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
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
语句中直接将其提供给数据库;如果不知道,你可以用它来得到它。