【发布时间】:2014-02-23 09:57:51
【问题描述】:
我创建了一个 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 字符代码。
我正在尝试做的是在另一个表中完全相同的事情,我复制并粘贴触发器并重命名触发器和表(字段名称和类型也相同)但它不起作用:
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 语句不匹配,或者它没有设置 Course_Code 字段...
您可以建议进行任何调试来解决这个问题吗?这让我发疯了,我不知道该怎么做才能诊断出问题。
干杯
【问题讨论】:
-
为什么你要这样做?如果
course_name足以识别tb_course中的唯一记录(这些触发器必须是这种情况),那么只需将其用作其他表中的外键即可。另外存储course_code违反3NF。 -
嗨,老实说,因为我不知道外键是什么...我草率地自学了我的 mysql 知识以使某些东西正常工作。我将阅读一些有关外键的内容,看看这是否对我有帮助。谢谢
-
好的,我明白你现在在说什么了。我还在输入到我的字段表中的数据中发现了一个错误,导致触发器失败(开头的空白我没有注意到),这解释了我原来的问题。感谢您的回复,我会做一些调整并最终开始使用一些外键而不是我的触发器。
-
实际上,许多应用程序使用代理键,例如
course_code,而不是自然的,例如course_name(一方面,它可以在不更新子表的情况下更改键值):也就是说,要遵守 3NF,您将仅在子表中存储course_code而不是course_name。这是怎么做到的?通常应用程序在插入数据时就知道相关的course_code——因此直接在INSERT语句中将其提供给数据库;如果不知道,可以使用INSERT ... SELECT获取。
标签: mysql