|
<div id="cnblogs_post_body">使用数据库的朋友大家想必都知道,如果想要维持&ldquo;一堆多&rdquo;数据表数据的一致性,必须做到以下几点:
1)插入时,外键必须包含于主表(&ldquo;1&rdquo;对多中&ldquo;1&rdquo;那个表)关联字段集合中。
2)删除时,主表关联字段被删除,其子表关联数据也一律自动被删除。
3)更新时,主表关联字段被更新,其子表关联数据也一律自动被更新。
其实要做到这三点,最简单的一个做法莫过于:
1)打开SQL Management Studio,成功登陆之后打开某个数据库(展开&ldquo;+&rdquo;节点),并且找到&ldquo;Diagram&rdquo;(关联图),导入所需要的表。
2)从主表(&ldquo;1&rdquo;)鼠标左键按住不放,拖拽到从表(&ldquo;多&rdquo;)的&ldquo;外键&rdquo;字段。在弹出的对话框中分别确定设置主表和从表即将关联的主键和外键。
3)右键生成的那个关联线,设置插入/删除更新时候的情况:

更新和删除规则有若干选项&mdash;&mdash;其中&ldquo;级联&rdquo;就是本文开头所说的部分&mdash;&mdash;&ldquo;一荣俱荣,一损俱损&rdquo;。
至于&ldquo;插入&rdquo;时的外键一致性,在&ldquo;强制外键约束&rdquo;默认设定为&ldquo;是&rdquo;可以得到体现(因为一旦创建了表关系,那么外键也就自动检查必须是隶属于主表关联字段的一个元素)。
其实我们也可以采用Trigger来完成同样的任务&mdash;&mdash;所谓Trigger即&ldquo;触发器&rdquo;(可以理解成&ldquo;事件&rdquo;,是一个特定动作行为产生之后所带来的连锁反应)。
对于&ldquo;插入&rdquo;时外键约束(我们假设有Categories和Products表,其中Category主表,其Id关联于从表的Products的CategoryId)。Trigger可以这样写:
<div class="cnblogs_code">Create TRIGGER [dbo].[AutoCheck] ON [dbo].[tb_Products] for insertAS BEGIN begin tran --保存欲待插入的categoryId declare @newCategoryId int select @newCategoryId = categoryid from inserted if(select count(*) from tb_Category where id=@newCategoryId)=1 begin print('成功插入!') commit end else begin print('插入失败!') rollback tran endEND |
|