范式、主外键

一、范式

       1.第一范式:略

       2.第二范式:不存在部分依赖

                         关键字为“组合关键字”时,不能有非关键字属性部分依赖组合键

                         反例: (学号,科目号)  学分    分数
                                     由于“科目号——>学分”,有部分依赖的情况,故不符合第二范式

       3.第三范式:不存在传递依赖

                         不能有非主关键字传递依赖于主关键字

                         反例:(科目号)   科目名      学分

                                    由于:“科目号——>科目名——>学分”,存在传递依赖的情况,故不符合第三范式

                                    注:一般只要有“非主属性X——>非主属性Y”的情况就不满足第三范式

二、主外键

     1.添加主键

        a)为StaffInfo表设置主键

            2011070315161965.jpg

             主键设置完成: 

              2011070315170387.jpg

        b)为Tasks表设置联合主键

           同时选中其中的两个列名:

            2011070315174379.jpg

           联合主键设置完成:

             2011070315193581.jpg

     2.添加外键

            2011070315203054.jpg

             打开“表和列规范”进行设置

            2011070315223710.jpg

             设置“主表中的列”和“从表中的列”的对应关系:

            2011070315225194.jpg

            外键设置完成之后,就可从“数据库关系图”中看到各个表之间的关系:

            2011070315233116.jpg

     3.主表与从表数据的插入与删除

         主表中原始数据如下:

         2011070314040611.jpg

         从表中原始数据如下:

         2011070314050372.jpg

         a)在从表中插入行

               1)主表中有外键列对应的值

1 use edisondb;
2   insert into Tasks(staffid,projectid,useddays)
3   values
4 ( 5001 , 1002 , 30 );

                  执行结果为:

                  2011070314115267.jpg

                  此时,Tasks表中的数据为:

                  2011070314141931.jpg

               2)主表中无外键列对应的值

1 use edisondb;
2   insert into Tasks(staffid,projectid,useddays)
3   values
4 ( 5009 , 1003 , 30 );

                   执行结果为:

2011070314165868.jpg

         b)在主表中删除行

               1)从表中外键列有对应的值

1 use edisondb;
2   delete from StaffInfo
3   where staffid = 5001 ;

                   执行结果为:

2011070314270363.jpg

 注:之所以会出现上面删除失败,是因为Sql Server默认情况下是不支持“级联删除”的(05中称为“层叠删除”);

       为了能“级联删除”,需要进行如下设置:(将删除规则由“无操作”改为“层叠”)

       2011070314542649.jpg

        保存设置之后,执行如下语句:

1 use edisondb;
2   delete from StaffInfo
3 where staffid = 5001 ;

        执行结果为:

        2011070314582555.jpg

        此时StaffInfo表中的数据为:

        2011070315031391.jpg

        Tasks表中的数据为:

        2011070315040428.jpg

               2)从表中外键列无对应的值

         执行如下语句:

1 use edisondb;
2 delete from StaffInfo
3 where staffid = 5002 ;

        执行结果为:

        2011070315083382.jpg

        此时,StaffInfo表中的内容为:

        2011070315101933.jpg

        注:当从主表中删除一行数据,且该行在从表外键列中没有对应数据时,无论是否设置了“级联删除”,该数据都可被成功删除。

转载于:https://www.cnblogs.com/edisonfeng/archive/2011/07/03/2096786.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值