zoukankan      html  css  js  c++  java
  • MYSQL复习笔记8-数据完整性

    Date: 20140207
    Auth: Jin

    一、数据完整性的分类
    数据完整性是指数据库中数据在逻辑上的一致性和准确性。包括三种
    1.实体完整性
    又称行的完成性,要求表中有一个主键,其值不能为空且唯一地标示对应的记录。
    可通过索引,UNIQUE约束,PRIMARY KEY约束或AUTO_INCREMENT(SQL SERVER为IDENTIFY)属性实现。
    (1)一个表只能创建一个PRIMARY KEY约束,但一个表中可以根据需要对表中不同的列创建若干个UNIQUE约束。
    (2)PRIMARY KEY字段的值不允许为NULL,而UNIQUE字段的值可以取NULL。
    2.域完整性
    称为列完整性,指给定列输入的有效性。
    实现方法有
    限制类型:通过数据类型
    格式:通过check约束和规则
    可能的取值范围:通过check约束,DEFAULT,NOT NULL定义和规则。
    create table kdb(
    classid int(6) NOT NULL,
    classname char(8) NOT NULL,
    credit tinyint CHECK(credit>=0 AND credit<=60)
    );
    注:SQL SERVER的例子 MYSQL中试试看
    mysql> show create table kdbG
    *************************** 1. row ***************************
    Table: kdb
    Create Table: CREATE TABLE `kdb` (
    `classid` int(6) NOT NULL,
    `classname` char(8) NOT NULL,
    `credit` tinyint(4) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    mysql> insert into kdb values (1,'classone',55);
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into kdb values (1,'classone',90);
    Query OK, 1 row affected (0.04 sec)
    mysql> select * from kdb;
    +---------+-----------+--------+
    | classid | classname | credit |
    +---------+-----------+--------+
    | 1 | classone | 55 |
    | 1 | classone | 90 |
    +---------+-----------+--------+
    2 rows in set (0.00 sec)

    MYSQL中check约束没用的,对于所有的存储引擎,CHECK子句会被分析,但是会被忽略。
    mysql5.1手册“CREATE TABLE语法”。1.8.5节,“MySQL与标准SQL的差别”
    接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序。

    3.参照完整性
    又称为参照完整性,保证主表中的数据与从表(被参考表)中数据一致性。
    SQL SERVER中通过定义外键与主键之间或者外键与唯一键之间的对应关系来实现。
    MYSQL 目前只有InnoDB引擎类型支持外键约束
    如果定义了两个表之间的参照完整性,则要求:
    1)从表不能引用不存的健值
    2)如果主表的健值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一直更改。
    3)如果主表中没有关联的记录,则不能将记录添加到从表
    如果要删除主表中某一记录,则应该删除从表与该记录匹配的相关记录。

    学生基本信息表XSB

    create table XSB (
    id char(6) not null,
    name varchar(8) not null,
    birthday date,
    sex bit not null default 1,
    comment text,
    PRIMARY key (id)
    );


    课程表KCB

    create table KCB (
    kid char(6) not null,
    kname varchar(35) not null,
    startdate date,
    credit smallint not null,
    period smallint default 60,
    PRIMARY key (kid)
    );


    选课表XKB

    create table XCB (
    xid char(6) not null primary key,
    sid char(6) not null,
    kid char(6) not null,
    grade tinyint default 0,
    foreign key (sid) references XSB(id),--sid是外键,参照XSB的id字段
    foreign key (kid) references KCB(kid) --kid是外键,参照KCB的kid字段
    );
    
    mysql> show create table XCBG
    *************************** 1. row ***************************
    Table: XCB
    Create Table: CREATE TABLE `XCB` (
    `xid` char(6) NOT NULL,
    `sid` char(6) NOT NULL,
    `kid` char(6) NOT NULL,
    `grade` tinyint(4) DEFAULT '0',
    PRIMARY KEY (`xid`),
    KEY `sid` (`sid`),
    KEY `kid` (`kid`),
    CONSTRAINT `XCB_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `XSB` (`id`),
    CONSTRAINT `XCB_ibfk_2` FOREIGN KEY (`kid`) REFERENCES `KCB` (`kid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 相关阅读:
    MYBATIS 的parameter
    深入了解MyBatis参数
    js之onload事件的一点使用心得
    js中document.write的那点事
    MyBatis直接执行SQL查询及批量插入数据
    ng 服务
    ng json格式的序列化和反序列化
    ng 自定义过滤器的创建和使用
    ng 过滤器
    ng 双向数据绑定 实现 注册协议效果
  • 原文地址:https://www.cnblogs.com/diege/p/3551458.html
Copyright © 2011-2022 走看看