MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。而MySQL中,约束是对表中的数据进行限定,保证数据的正确性、有效性和完整性。MySQL约束和触发器其实都和表有关,下面我们就来比较一下MySQL约束和触发器的优劣。
首先,不得不说,就MySQL数据库而言,约束和触发器在特殊情况下各有优势。
触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性(RI) 则应通过 FOREIGN KEY 约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。
例如:除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。
触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。
如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。触发器到底可不可以在视图上创建呢?在SQL Server™ 联机丛书中,是没有说触发器不能在视图上创建的,并且在语法解释中表明:在 CREATE TRIGGER 的 ON 之后可以是视图。 然而,事实似乎并不是如此,很多专家也说触发器不能在视图上创建。测试的结果也的确如此,不管是普通视图还是索引视图,都无法在上面创建触发器,但真的是这样吗?
无可厚非的是:当在临时表或系统表上创建触发器时会遭到拒绝。深刻理解FOR CREATE TRIGGER语句的FOR关键字之后可以跟INSERT、UPDATE、DELETE 中的一个或多个,也就是说在其它情况下是不会触发触发器的,包括SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。
在本站的MySQL教程中有对MySQL约束和触发器的详细讲解,想要深入学习的小伙伴可以结合本文和教程中的学习资料,彻底梳理清MySQL数据库中的约束和触发器的纷纷扰扰。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习