牛腩老师讲B/S开发小结 触发器 主键 外键

本文介绍了牛腩老师的新闻发布系统教程,探讨了系统采用的三层架构及其功能实现方式。重点讲解了通过存储过程改进传统SQL语句操作的方法,以及触发器的应用。

截止此文发表时,我刚刚对牛腩老师的新闻发布系统的视频教程,有了一个初步了解。后面对于如何美化WEB界面,如何使用其他工具修整网站页面,我还尚未接触。

我想只针对这个新闻发布系统的功能实现,来说一说自己的理解。

从架构上来说,这个系统应用的是三层(设计模式),在老师的视频中,总共分为DAL 、BLL 、Modal ,很自然的想到,牛腩老师在系统设计上并没有涉及灵活更换数据库的解决方案。不过,过后在我实现新闻发布系统的时候可以帮牛腩老师弥补这个缺陷。

在视频中,老师的功能实现手法确是让我耳目一新,以前做过的几个数据库操作系统,都是直接使用简单的sql语句,并且还是简陋、危险地字符串拼接方法。时效性、安全性定是很低了。

而在视频中,老师在创建数据库的时候,涉及了相关表的主键、外键。(表的主键,说白了就是在一个表里边唯一的行标示字段,自然在这个表中,主键是不会重复的;表的外键,简单地说就是本表相对外表之间的有关联关系的字段(两表相同的属性/字段),表述的是表与表之间的关系,自然成为了子表。)

对于原本sql语句实现的功能,基本上都是由存储过程来实现的,这样省去我们在代码中编写具体的sql语句了,直接在数据库中编写代码就能实现功能。

存储过程优点:

ü 由一系列T-SQL语句组成,可作为一个整体被程序多次调用。

ü 修改容易,可移植性好。

ü 存储过程是预编译的,执行速度快。

ü 在网络中调用存储过程时,只需要传递调用过程的语句,因此可减少网络流量。

ü 可通过对执行存储过程的权限控制来保证系统数据的安全。

ü 存储过程可嵌套调用,即在一个存储过程中调用另一个存储过程

还有,触发器。在视频中,老师简单的讲述了一下触发器的使用。而触发器,顾名思义可以理解成事件过程,当该表的某个操作事件发生了,则会触发某个过程操作,其与存储过程不是一个操作层次的。每个触发器,都有两张特殊的临时表.

其实,使用存储过程或触发器,都是将编码过程写在了数据库管理系统中,而不是以往的写在类中、模块中了。我认为,这样做效率提高了,省去了不少中间过程,但复用性、扩展性也却降低了,并且占用服务器端太多资源,调试排错比较困难 维护起来不方便。(希望路过打酱油的童鞋们拍砖哈~ )。

<think>好的,用户想了解如何使用触发器来模拟约束的功能。首先,我需要回忆约束的作用,比如保证数据完整性、级联更新和删除等。用户可能遇到的是使用不支持的存储引擎,比如MySQL的MyISAM,或者需要更灵活的控制。 接下来,我应该考虑触发器的类型,包括BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE等,确保在操作前或后执行检查。需要模拟的参照完整性,比如插入子表时检查父表是否存在对应的记录。 然后,需要分步骤说明,比如创建示例表、编写触发器逻辑。可能遇到的问题包括如何阻止无效操作,比如在插入子表时父表没有对应记录,可以通过触发器中引发错误或设置无效值来阻止。 还要考虑级联更新和删除的实现,比如当父表更新或删除时,自动更新或删除子表的相关记录。这里可能需要AFTER UPDATE和AFTER DELETE触发器。 然后,需要验证触发器的有效性,通过示例SQL语句测试各种情况,确保触发器按预期工作。同时,要注意触发器的执行顺序和性能影响,避免过多的触发器导致性能下降。 最后,总结使用触发器的优缺点,比如灵活性高但维护复杂,性能可能不如原生等。还要确保引用的资料正确,比如用户提供的引用中提到了约束和触发器的使用场景,需要正确引用这些内容。</think>### 使用触发器模拟约束的方法 #### 1. 核心原理 通过触发器在数据操作(INSERT/UPDATE/DELETE)前后添加逻辑校验,强制维护父子表间的数据一致性。例如: - 插入子表前验证父表是否存在对应记录 - 删除父表记录时同步更新/删除子表关联数据 #### 2. 实现步骤 **步骤1:创建示例表** ```sql -- 父表 CREATE TABLE department ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 子表(无声明) CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), dept_id INT -- 需要与department.id关联 ); ``` **步骤2:插入校验触发器** ```sql DELIMITER $$ CREATE TRIGGER before_employee_insert BEFORE INSERT ON employee FOR EACH ROW BEGIN IF NOT EXISTS (SELECT 1 FROM department WHERE id = NEW.dept_id) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '违反约束:部门不存在'; END IF; END$$ DELIMITER ; ``` *此触发器会在插入employee记录前检查关联部门是否存在[^1]* **步骤3:级联更新触发器** ```sql DELIMITER $$ CREATE TRIGGER after_department_update AFTER UPDATE ON department FOR EACH ROW BEGIN UPDATE employee SET dept_id = NEW.id WHERE dept_id = OLD.id; END$$ DELIMITER ; ``` *实现父表ID变更时自动更新子表关联字段[^3]* **步骤4:级联删除处理** ```sql DELIMITER $$ CREATE TRIGGER before_department_delete BEFORE DELETE ON department FOR EACH ROW BEGIN DELETE FROM employee WHERE dept_id = OLD.id; END$$ DELIMITER ; ``` *删除部门前自动清理关联员工记录* #### 3. 验证测试 ```sql -- 测试无效插入 INSERT INTO employee VALUES (1, '张三', 999); -- 触发错误[45000] -- 测试级联更新 UPDATE department SET id = 100 WHERE id = 1; SELECT * FROM employee WHERE dept_id = 100; -- 应显示更新后的关联记录 -- 测试级联删除 DELETE FROM department WHERE id = 100; SELECT * FROM employee WHERE dept_id = 100; -- 应无结果返回 ``` #### 4. 注意事项 - 需要为每个关联关系创建多个触发器(INSERT/UPDATE/DELETE) - 触发器执行顺序影响最终结果 - 性能损耗高于原生约束 - 事务处理需要显式控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值