zoukankan      html  css  js  c++  java
  • 范式

      函数依赖:当某一列的数据必须随着另一列的数据改变而改变,表示第一列函数依赖与第二列.快速表示函数依赖的方式:T.x--->T.y,在关系表T中,y列函数依赖与x列。

      部分函数依赖:非主键的列依赖于组合主键的某个部分(但不是完全依赖于组合主键)。

      传递依赖:如果改变任何非主键的列可能造成其他列的改变,即为传递依赖。

      传递函数依赖:任何非主键列与另一个非主键列有关联。

    第一范式,或1NF:

      规则一:数据列只包括具有原子性的值

      规则二:没有才重复的数据组

    第二范式,或2NF

      规则一:符合1NF

      规则二:没有部分函数依赖性。

    第三范式,或3NF

      规则一:符合2NF

      规则二:没有传递函数依赖性。

    外键约束

      如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。 

         首先创建用户组表: 

    create table t_group (
              id int not null,
              name varchar(30),
              primary key (id));
    

      插入两条记录:  

    insert into t_group values (1, 'Group1'),(2, 'Group2');
    

      下面创建用户表,分别以不同的约束方式创建外键引用关系: 

    1、级联(cascade)方式 

    create table t_user (
            id int not null,
            name varchar(30),
            groupid int,
            primary key (id),
            foreign key (groupid) references t_group(id) on delete cascade on update cascade);
    

      测试 

    insert into t_user values (1, 'qianxin', 1);//可以插入
    insert into t_user values (2, 'yiyu', 2);//可以插入
    insert into t_user values (3, 'dai', 3);//错误,无法插入,用户组3不存在,与参照完整性约束不符
    delete from t_group where id=2;//导致t_user中的2记录级联删除
    update t_group set id=2 where id=1;//导致t_user中的1记录的groupid级联修改为2
    

    2、置空(set null)方式 

    create table t_user (
           id int not null,
           name varchar(30),
           groupid int,
           primary key (id),
           foreign key (groupid) references t_group(id) on delete set null on update set null);
    

      测试:

    //参照完整性测试
    insert into t_user values (1, 'qianxin', 1); --可以插入
    insert into t_user values (2, 'yiyu', 2);    --可以插入
    insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符
    //约束方式测试
    delete from t_group where id=2;//导致t_user中的2记录的groupid被设置为NULL
    update t_group set id=2 where id=1;//导致t_user中的1记录的groupid被设置为NULL
    

    3、禁止(no action / restrict)方式 

    create table t_user (
           id int not null,name varchar(30),
           groupid int,
           primary key (id),
           foreign key (groupid) references t_group(id) on delete no action on update no action);
    

      测试:

    insert into t_user values (1, 'qianxin', 1);//可以插入
    insert into t_user values (2, 'yiyu', 2);//可以插入
    insert into t_user values (3, 'dai', 3); //错误,无法插入,用户组3不存在,与参照完整性约delete from t_group where id=2; //错误,从表中有相关引用,因此主表中无法删除
    update t_group set id=2 where id=1; //错误,从表中有相关引用,因此主表中无法修改
    
     
    

    完整性约束

      更新数据库时,表中不能出现不符合完整性要求的记录,以保证为用户提供正确、有效的数据。实现该目的最直接的方法,是在编写数据库应用程序时,对每个更新操作都进行完整性检查。但这种检查往往是复杂、重复、低效的。SQL把各种完整性约束作为数据库模式定义的一部分,由数据库管理系统维护,这样即可有效防止对数据库的意外破坏,提高了完整性检测的效率,又减轻了编程人员的负担。

    SQL Server支持三种完整性约束:

    1. 实体完整性;
    2. 参照完整性(或引用完整性);
    3. 用户自定义完整性

    1.实体完整性和主码

      实体完整性是通过主码(PRIMARY KEY)的定义来实现的。一旦某个属性或属性组被定义为主码,该主码的每个属性就不能为空值,并且在表中不能出现主码值完全相同的两个记录。主码可以在CREATE TABLE语句中使用PRIMARY KEY定义。有两种定义主码的方法:一种是在属性后增加关键字PRIMARY KEY,另一种是在属性表中加入额外的定义主码的子句:PRIMARY KEY(主码属性名表)。如果表的主码只含有单个属性,上面的两种方法都可以使用。如果主码由多个属性组成,只能使用第二种方法。除了主码,SQL提供了类似候选码的说明方法,使用关键字UNIQUE定义(与候选码不同的是:定义为UNIQUE的属性可以定义为空值,但只能有一个记录该属性的值为NULL),说明该属性(或属性组)的值不能重复。一个表中只能有一个主码,但可以有多个“UNIQUE”定义。

    3.用户自定义完整性约束

      SQL提供非空约束、对属性的CHECK约束、对元组的CHECK约束、触发器等来实现用户的完整性要求。

    3.1基于属性的CHECK约束(MYSQL暂时不支持check功能)

      使用CHECK(检查)子句可保证属性值满足某些前提条件。CHECK子句的一般格式为:

    CHECK<条件>
    

      属性的CHECK约束既可跟在属性的定义后,也可在定义语句中另增一子句加以说明。设定StudentInfo表中age值不能小于18、大于65。只需将age属性说明为如下形式:

    age int CHECK(age >= 18 and age <= 65)
    

    3.2基于元组的约束

    CREATE TABLE salary(
            Eno char(4),
            Basepay decimal(7, 2),
            Insure decimal(7, 2),
            Fund decimal(7, 2),
           CHECK (Insure + Fund < Basepay)
    );
    

      上面例子中,CHECK约束涉及到表中多个属性,为元组约束。

    3.3约束的更新

      约束与数据库中的表、视图等一样,可以进行增加、删除和修改的更新操作。为了更新约束,需要在定义约束是对约束进行命名,在约束前加上关键字CONSTRAINT和该约束的名称。例如要说明StudentInfo表中的主码时,将其命名为PK_StudentInfo_ID.

    CREATE TABLE StudentInfo(
             StudentID  char(8),
             StudentName    varchar(10),
             StudentSex     bit,
             CONSTRAINT PK_StudentInfo_ID  PRIMARY KEY(StudentID)
    );
    

      可以使用ALTER TABLE语句来更新与属性或表有关的约束.

    //删除约束:
    ALTER TABLE DROP CONSTRAINT 约束名
    //增加约束
    ALTER TABLE ADD CONSTRAINT 约束名 约束定义
    
  • 相关阅读:
    [React Intl] Format Numbers with Separators and Currency Symbols using react-intl FormattedNumber
    [React Intl] Format a Date Relative to the Current Date Using react-intl FormattedRelative
    [React Intl] Format Date and Time Using react-intl FormattedDate and FormattedTime
    [React Intl] Render Content with Markup Using react-intl FormattedHTMLMessage
    带你走进EJB--MDB
    Google Play和基于Feature的过滤 —— Feature 参考手册
    常见排序算法的实现
    Never-build package 'XXXX' requires always-build package 'EhLib70'
    自制的七个C,总结的太好了
    那些有影响力的语言
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5743935.html
Copyright © 2011-2022 走看看