精华内容
下载资源
问答
  • MySQL数据完整性

    2021-01-18 21:13:27
    如何保证数据完整性数据的完整性可以分为三类:实体完整性、域完整性、参照完整性无论是哪一种完整性都是在创建表时给表添加约束即可实体完整性????什么是实体表中的一行数据就是一个实体(entity)????如何保证实体...

    什么是数据的完整性

    保证保存到数据库中的数据都是正确的

    🐤如何保证数据完整性

    数据的完整性可以分为三类:实体完整性、域完整性、参照完整性

    无论是哪一种完整性都是在创建表时给表添加约束即可

    实体完整性

    🐤什么是实体

    表中的一行数据就是一个实体(entity)

    🐸如何保证实体完整性

    保证实体完整性就是保证每一行数据的唯一性

    🦄实体完整性的约束类型

    主键约束(primary key)

    唯一约束(unique)

    自动增长列(auto_increment)

    主键约束(primary key)

    主键用于唯一标识表中的每一条数据,和现实生活中的身份证很像

    create table person(

    id int primary key,

    name varchar(20)

    );

    insert into person values (1, 'BNTang');

    insert into person values (2, 'JonathanTang');

    🐪主键的特征

    如果将某一个字段设置成了主键,那么这个字段的取值就不能重复了

    如果将某一个字段设置成了主键,那么这个字段的取值就不能是null了

    一张表中只能有一个主键,不能出现多个主键

    create table person2(

    id int primary key,

    name varchar(20) primary key

    );

    我们除了可以在字段数据类型后面添加primary key,将这个字段变成主键以外,还可以通过在最后写上primary key(字段名称)的方式来指定主键

    create table person3(

    id int,

    name varchar(20),

    primary key(id)

    );

    insert into person3 values (1, 'BNTang');

    insert into person3 values (1, 'BNTang');

    什么是联合主键

    我们通过将表中的某个永远不重复的字段设置为主键, 从而达到保证每一行数据的唯一性(实体完整性)

    但是在企业开发中有时候我们可能找不到不重复的字段, 此时我们还可以通过联合主键的方式来保证每一行数据的唯一性

    联合主键就是同时将多个字段作为一个主键来使用

    ________

    |name| age|

    |tyh | 88 |

    |zs | 88 |

    |tyh | 33 |

    create table person(

    name varchar(20),

    age int,

    primary key(name, age)

    );

    insert into person values ('BNTang', 88);

    insert into person values ('BNTang', 88);

    🐤注意点

    联合主键并不是添加多个主键, 而是将多个字段的值作为主键来使用

    也就是过去我们指定id为主键, 那么id的取值不能重复

    而现在如果我们指定name和age为主键, 那么name+age的值不能重复

    唯一约束(unique)

    唯一约束用于保证某个字段的值永远不重复

    create table person(

    id int unique,

    name varchar(20)

    );

    insert into person values (1, 'BNTang');

    insert into person values (1, 'BNTang');

    🐸主键和唯一键异同

    唯一约束和主键约束一样, 被约束的字段的取值都不能够重复

    主键在一张表中只能有一个, 而唯一约束在一张表中可以有多个

    create table person2(

    id int unique,

    name varchar(20) unique

    );

    insert into person2 values (1, 'BNTang');

    insert into person2 values (2, 'BNTang');

    主键的取值不能为Null, 而唯一约束的取值可以是Null

    insert into person2 values (2, null);

    自动增长约束(auto_increment)

    自动增长约束的作用是让某个字段的取值从1开始递增, 从而保证实体完整性

    drop table if exists person;

    create table person(

    id int auto_increment,

    name varchar(20)

    );

    Incorrect table definition; there can be only one auto column and it must be defined as a key

    🐤注意点

    如果某个字段是自动增长的, 那么这个字段必须是主键才可以

    drop table if exists person;

    create table person(

    id int auto_increment primary key,

    name varchar(20)

    );

    insert into person values (1, 'BNTang');

    如果仅仅是主键, 那么取值不能是null, 但是如果主键还是自动增长的, 那么取值就可以是null或者default

    insert into person values (null, 'BNTang');

    insert into person values (default, 'BNTang');

    在企业开发中我们应该如何选择主键

    最少性: 能用一个字段作为主键, 就不要使用多个字段

    稳定性: 能用不被操作(修改)的字段作为主键, 就不要使用会被操作的字段作为主键

    一般情况下我们会定义一个名称叫做id的字段, 并且这个字段是整型的, 并且这个字段是自动增长的来作为主键

    修改约束

    修改主键约束

    格式:alter table 表名 add primary key(字段);

    drop table if exists person;

    create table person(

    id int,

    name varchar(20)

    );

    alter table person add primary key(id);

    insert into person values (1, 'BNTang');

    修改唯一约束

    格式:alter table 表名 add unique(字段);

    drop table if exists person;

    create table person(

    id int,

    name varchar(20)

    );

    alter table person add unique(name);

    insert into person values (1, 'BNTang');

    修改自动增长约束

    格式:alter table 表名 modify 字段名称 数据类型 auto_increment;

    drop table if exists person;

    create table person(

    id int,

    name varchar(20)

    );

    alter table person add primary key(id);

    alter table person modify id int auto_increment;

    insert into person values (null, 'BNTang');

    域完整性

    🐤什么是域

    一行数据中的每个单元格就是一个域

    🐸如何保证域的完整性

    保证域的完整性就是保证每个单元格数据的正确性

    使用正确的数据类型

    例如:人的年龄不可能超过255岁,而且不能是负数,所以我们就可以使用 TINYINT UNSIGNED

    例如:人的性别只能是男/女或者妖,所以我们就可以使用枚举类型

    例如:要存储比较多的文字,为了保证不超出每一行最大的存储限制, 我们就可以使用大文本类型

    使用非空约束(not null)

    使用默认值约束(default)

    drop table if exists person;

    create table person(

    id int,

    name varchar(20) not null

    );

    insert into person values (1, null);

    drop table if exists person;

    create table person(

    id int,

    name varchar(20) default 'BNTang666'

    );

    insert into person values (1, null);

    insert into person values (2, default);

    insert into person values (3, 'zs');

    🐤注意点:哪怕设置了默认值, 传入null之后也不会使用默认值

    参照完整性

    参照完整性又称引用完整性, 主要用于保证多表之间引用关系的正确性

    🐸为什么要创建多张表

    示例:定义一张表保存2个学生3门课程的成绩

    |---------------------------------|

    | id | name | gender | km | score |

    | 1 | 张三 | 男 |语文| 100 |

    | 2 | 张三 | 男 |数学| 99 |

    | 3 | 张三 | 男 |英语| 98 |

    | 4 | 李四 | 女 |语文| 60 |

    | 5 | 李四 | 女 |数学| 59 |

    | 6 | 李四 | 女 |英语| 58 |

    |---------------------------------|

    如果将所有的数据都放到一张表中, 会出现大量冗余数据

    所以为了降低数据库的体积, 提升数据库的效率, 我们需要根据自身需求对表进行拆分

    |--------------------| |-----------------------|

    | id | name | gender | | id | km | score | uid |

    | 1 | 张三 | 男 | | 1 |语文| 100 | 1 |

    | 2 | 李四 | 女 | | 2 |数学| 99 | 1 |

    |--------------------| | 3 |英语| 98 | 1 |

    | 4 |语文| 60 | 2 |

    | 5 |数学| 59 | 2 |

    | 6 |英语| 58 | 2 |

    |-----------------------|

    什么时候会出现冗余数据

    表与表之间的关系可以分为三种:一对一、一对多、多对多

    🐤一对一(一般不需要拆分)

    一夫一妻制

    |-----------------------------|

    | id | name | gender | mateId |

    | 1 | 张三 | 男 | 2 |

    | 2 | 李四 | 女 | 1 |

    | 3 | 王五 | 男 | 4 |

    | 4 | 赵六 | 女 | 2 |

    |-----------------------------|

    🐸一对多(一般需要拆分)

    一个人有多个汽车

    一个班有多个学生

    一个人有多们成绩

    |---------------------------------|

    | id | name | gender | km | score |

    | 1 | 张三 | 男 |语文| 100 |

    | 2 | 张三 | 男 |数学| 99 |

    | 3 | 张三 | 男 |英语| 98 |

    | 4 | 李四 | 女 |语文| 60 |

    | 5 | 李四 | 女 |数学| 59 |

    | 6 | 李四 | 女 |英语| 58 |

    |---------------------------------|

    |--------------------| |-----------------------|

    | id | name | gender | | id | km | score | uid |

    | 1 | 张三 | 男 | | 1 |语文| 100 | 1 |

    | 4 | 李四 | 女 | | 2 |数学| 99 | 1 |

    |--------------------| | 3 |英语| 98 | 1 |

    | 4 |语文| 60 | 2 |

    | 5 |数学| 59 | 2 |

    | 6 |英语| 58 | 2 |

    |-----------------------|

    🐬多对多(一般需要拆分)

    一个学生有多个老师,一个老师有多个学生

    |--------------------------------------------|

    | id | stuName | gender | teacherName | 性别 |

    | 1 | 张三 | 男 | 王五 | 男 |

    | 2 | 张三 | 男 | 赵六 | 女 |

    | 3 | 张三 | 男 | 周七 | 男 |

    | 4 | 李四 | 女 | 王五 | 男 |

    | 5 | 李四 | 女 | 赵六 | 女 |

    | 6 | 李四 | 女 | 周七 | 男 |

    |--------------------------------------------|

    |-----------------------| |---------------------| |-----------------------|

    | id | stuName | gender | | stuId | teacherId | | id | stuName | gender |

    | 1 | 张三 | 男 | | 1 | 1 | | 1 | 王五 | 男 |

    | 2 | 李四 | 女 | | 1 | 2 | | 2 | 赵六 | 女 |

    |-----------------------| | 1 | 3 | | 3 | 周七 | 男 |

    | 2 | 1 | |-----------------------|

    | 2 | 2 |

    | 2 | 3 |

    |---------------------|

    如何保证参照完整性

    默认情况下表与表之间是独立存在的, 不会相互影响

    也正是因为如此, 默认情况下也不会检查表与表之间的依赖关系

    所以为了保证表与表之间参照完整性, 我们可以通过外键来保证参照完整性

    drop table if exists stu;

    create table stu(

    id int auto_increment primary key,

    name varchar(20),

    gender enum('男','女','妖')

    );

    drop table if exists grade;

    create table grade(

    id int auto_increment primary key,

    km varchar(20),

    score double,

    uid int

    );

    insert into stu values (null, 'zs', '男');

    insert into stu values (null, 'ls', '女');

    insert into grade values (null, '语文', 100, 1);

    insert into grade values (null, '数学', 99, 1);

    insert into grade values (null, '英语', 98, 1);

    insert into grade values (null, '语文', 100, 3);

    insert into grade values (null, '数学', 99, 3);

    insert into grade values (null, '英语', 98, 3);

    上方的数据肯定是不符合参照完整性的,因为还没有约定外键

    什么是外键

    如果一张表中有一个字段指向了另外一张表中的主键,就将该字段叫做外键

    例如:成绩表中的uid引用了学生表中的id, 那么成绩表中的uid我们就称之为外键

    |--------------------| |-----------------------|

    | id | name | gender | | id | km | score | uid |

    | 1 | 张三 | 男 | | 1 |语文| 100 | 1 |

    | 2 | 李四 | 女 | | 2 |数学| 99 | 1 |

    |--------------------| | 3 |英语| 98 | 1 |

    | 4 |语文| 60 | 2 |

    | 5 |数学| 59 | 2 |

    | 6 |英语| 58 | 2 |

    |-----------------------|

    drop table if exists grade;

    create table grade(

    id int auto_increment primary key,

    km varchar(20),

    score double,

    uid int,

    foreign key(uid) references stu(id)

    );

    insert into grade values (null, '语文', 100, 1);

    insert into grade values (null, '数学', 99, 1);

    insert into grade values (null, '英语', 98, 1);

    insert into grade values (null, '语文', 100, 3);

    insert into grade values (null, '数学', 99, 3);

    insert into grade values (null, '英语', 98, 3);

    外键注意点

    在上面的插入语句中肯定是有问题的,应为主表当中没有id为3的学生

    只有InnoDB的存储引擎才支持外键约束

    外键的数据类型必须和指向的主键一样

    在一对多的关系中, 外键一般定义在多的一方(一个学生有多门成绩, 那么外键定义在成绩表中)

    定义外键的表我们称之为从表, 被外键引用的表我们称之为主表

    创建表时定义外键

    语法:foreign key(外键字段名称) references 主表名称(主表主键名称)

    如何动态添加外键

    alter table 从表名称 add foreign key(外键字段名称) references 主表名称(主表主键名称);

    drop table if exists grade;

    create table grade(

    id int auto_increment primary key,

    km varchar(20),

    score double,

    uid int

    );

    insert into grade values (null, '语文', 100, 2);

    alter table grade add foreign key(uid) references stu(id);

    insert into grade values (null, '语文', 100, 2);

    如何查看外键是谁

    语法:show create table 从表名称;

    show create table grade;

    CREATE TABLE `grade` (

    `id` int NOT NULL AUTO_INCREMENT,

    `km` varchar(20) DEFAULT NULL,

    `score` double DEFAULT NULL,

    `uid` int DEFAULT NULL,

    PRIMARY KEY (`id`),

    KEY `uid` (`uid`),

    CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `stu` (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

    🐤注意点

    CONSTRAINT grade_ibfk_1 FOREIGN KEY (uid) REFERENCES stu (id)含义

    将uid变成外键, 外键的名称是grade_ibfk_1

    uid的取值引用的是stu这张表中的id字段的值

    如何动态删除外键

    语法:alter table 从表名称 drop foreign key 外键名称;

    alter table grade drop foreign key grade_ibfk_1;

    insert into grade values (null, '语文', 100, 3);

    外键的操作

    🐤严格操作(前面的都是严格操作)

    主表不存在对应数据,从表不允许添加不存在之外的数据

    insert into grade values (null, '语文', 100, 3);

    从表在引用着主表数据,主表不允许删除被引用的数据

    delete from stu where id = 1;

    从表引用的数据, 主表不允许修改,也就是说从表引用期间主表不可以对引用的数据进行修改

    update stu set id = 3 where id = 1;

    🐸置空操作(null)

    在企业开发中, 我们可能必须要删除主表中的数据, 但是如果主表被删除了从表就不完整了

    所以在企业开发中, 我们可以通过置空操作, 在删除主表数据的同时删除从表关联的数据

    drop table if exists grade;

    create table grade(

    id int auto_increment primary key,

    km varchar(20),

    score double,

    uid int,

    foreign key(uid) references stu(id) on delete set null

    );

    insert into grade values (null, '语文', 100, 1);

    delete from stu where id = 1;

    🐬级联操作(cascade)

    在企业开发中, 我们可能必须要修改主表中的数据, 但是如果主表被修改了从表就不完整了

    所以在企业开发中, 我们可以通过级联操作, 在修改主表数据的同时修改从表关联的数据

    drop table if exists grade;

    create table grade(

    id int auto_increment primary key,

    km varchar(20),

    score double,

    uid int,

    foreign key(uid) references stu(id) on update cascade

    );

    insert into grade values (null, '语文', 100, 2);

    update stu set id=1 where id = 2;

    [constraint 外键名称] foreign key(外键字段) references 主表(主键)[主表删除的动作][主表更新的动作]

    一般情况下主表删除时从表置空, 主表更新时从表级联

    多对多外键

    学生表 关系表 教师表

    |-----------------------| |---------------------| |-----------------------|

    | id | stuName | gender | | stuId | teacherId | | id | stuName | gender |

    | 1 | 张三 | 男 | | 1 | 1 | | 1 | 王五 | 男 |

    | 2 | 李四 | 女 | | 1 | 2 | | 2 | 赵六 | 女 |

    |-----------------------| | 1 | 3 | | 3 | 周七 | 男 |

    | 2 | 1 | |-----------------------|

    | 2 | 2 |

    | 2 | 3 |

    |---------------------|

    首先准备脚本,准备好测试数据

    drop table if exists stu;

    create table stu(

    id int auto_increment primary key,

    name varchar(20),

    gender enum('男','女','妖')

    );

    insert into stu values (null, '张三', '男');

    insert into stu values (null, '李四', '女');

    drop table if exists teacher;

    create table teacher(

    id int auto_increment primary key,

    name varchar(20),

    gender enum('男','女','妖')

    );

    insert into teacher values (null, '王五', '男');

    insert into teacher values (null, '赵六', '女');

    insert into teacher values (null, '周七', '男');

    drop table if exists rel;

    create table rel(

    stuId int,

    teacherId int

    );

    insert into rel values (1, 1);

    insert into rel values (1, 2);

    insert into rel values (1, 3);

    insert into rel values (2, 1);

    insert into rel values (2, 2);

    insert into rel values (2, 3);

    alter table rel add foreign key(stuId) references stu(id);

    alter table rel add foreign key(teacherId) references teacher(id);

    insert into rel values (3, 1);# 报错

    insert into rel values (1, 4);# 报错

    展开全文
  • MySQL 数据完整性

    2021-02-02 05:16:10
    数据库实验回顾sql实体完整性数据库实体完整性即主码的属性不能为空。而主码就可保证元组是不重复的,即主码值是不能重复的。设计参照完整性code参照完整性保证外码的值要么是被参照关系中的主码值,要么取空值。it...

    数据库实验回顾sql

    实体完整性数据库

    实体完整性即主码的属性不能为空。而主码就可保证元组是不重复的,即主码值是不能重复的。设计

    参照完整性code

    参照完整性保证外码的值要么是被参照关系中的主码值,要么取空值。it

    用户自定义完整性table

    能够按系统的需求设计各类自定义的完整性检查。class

    1、实体完整性

    一、主键约束

    主键(promary key)用于惟一的标识表中的某一条记录,在两个表的关系中,主键用来在一个表中引用来自另外一个表中的特定记录。一个表的主键能够由多个关键字共同组成,而且主键的列不能包含空值。主键的值能惟一标识表中的每一行,这就比如全部人都有身份证,每一个人的身份证号是不一样的,能惟一标识每个人。原理

    添加主键date

    ALTER TABLE 表名 ADD PRIMARY KEY(列名);

    设置主键select

    ALTER TABLE orders ADD PRIMARY KEY(列名);

    在建立表的时候,设置主键

    -- 单个字段的主键

    CREATE TABLE 表名(

    字段名 数据类型 PRIMARY KEY

    );

    -- 多个字段组合的主键

    CREATE TABLE 表名(

    字段名1 数据类型,

    字段名2 数据类型,

    .....

    PRIMARY KEY(字段名1, 字段名2, 字段名n)

    );

    二、惟一约束

    惟一约束用于保证数据表中字段值的惟一性,在 MySQL 中使用 UNIQUE 关键字添加惟一约束。在建立表时为某个字段添加惟一约束的具体语法格式以下:

    CREATE TABLE 表名(

    字段名 数据类型 UNIQUE,

    ....

    );

    注意:被定义成惟一约束的字段,字段值不能相同。可是能够为 NULL。

    惟一约束也能够添加到已经建立完成的表中,语法格式以下:

    ALTER TABLE 表名 ADD UNIQUE(列名);

    三、自动增加列

    数据表中的 id 字段通常从1开始插入,不断增长,每次插入新数据时,都要添加一个 id 字段的值,当数据内容庞大时,容易出错。为了解决这个问题,能够将 id 字段的值设置为自动增长。在 MySQL 中使用 AUTO_INCREMENT 关键字设置表字段值自动增长。在建立表时将某个字段的值设置为自动增加,语法格式以下:

    CREATE TABLE 表名(

    字段名 数据类型 AUTO_INCREMENT,

    ....

    );

    此外,也能够为已经建立完成的表字段设置自动增加列,语法格式以下:

    ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY AUTO_INCREMENTL;

    2、参照完整性

    MySQL参照完整性通常是经过MySQL外键(foreign key)实现的

    删除参照约束

    ALTER 表 DROP FOREIGN KEY fg_fk;

    给现有表增长参照约束

    ALTER TABLE`score`ADD CONSTRAINT`score_fk2`FOREIGN KEY (`sid`) REFERENCES`student`(`sid`);

    数据库系统的外键值更新模式通常有3种:

    默认的外键管理是Restict,即限制方式。前面实验咱们已经见识了这种方式的做用。

    CASCADE,即级联方式,能够理解为株连九族,即主键改变后,引用它的外键值自动改变成新主键值来保证参照完整性。

    SET NULL,置空,即主键值改变后,引用它的外键值自动改成NULL来保证参照完整性。

    eg

    alter table 表名

    add constraint fk_js foreign key(任课教师编号) references teacher (工号) on update cascade;

    3、用户自定义完整性

    像MS SQL Server等数据库管理系统有CHECK约束能够很方便地实现用户自定义完整性约束。但MySQL没有提供真正的CHECK约束。但用户自定义约束的原理都差很少,经过触发器就能够实现。

    例如:学生年龄不能取负值的约束

    -- insert 触发器 年龄不能为负

    delimiter ;

    delimiter $$

    create trigger st_ins_chk_age before insert

    on student

    for each row

    begin

    if new.年龄 is not NULL and new.年龄 < 0 then

    signal sqlstate 'HY000'

    set message_text = "年龄不能为负";

    end if;

    end$$

    -- update 触发器 年龄不能为负

    delimiter ;

    delimiter $$

    create trigger st_up_chk_age before update

    on student

    for each row

    begin

    if new.年龄 is not NULL and new.年龄 < 0 then

    signal sqlstate 'HY000'

    set message_text = "年龄不能为负";

    end if;

    end$$

    delimiter ;

    c931bb4d8fc0482296b4d229.html

    附加

    不用外键,而利用触发器实现socre的课号要级联参照course中的课号?

    score 表

    -- 触发器 实现 score 外键 学号 参照 student 学号 -- score

    delimiter ;

    delimiter $$

    create trigger sc_fk_ins_xh before insert

    on score

    for each row

    begin

    if (select count(*) from student where 学号=new.学号)=0 and new.学号 is not NULL then

    signal sqlstate 'HY000'

    set message_text = "Cannot add or update a child row: a foreign key constraint ...";

    end if;

    end$$

    create trigger sc_fk_up_xh before update

    on score

    for each row

    begin

    if (select count(*) from student where 学号=new.学号)=0 and new.学号 is not NULL then

    signal sqlstate 'HY000'

    set message_text = "Cannot add or update a child row: a foreign key constraint ...";

    end if;

    end$$

    delimiter ;

    注意:score 中是 new ,student 中是 old

    student 表

    -- 触发器 实现 score 外键 学号 参照 student 学号 -- student

    delimiter ;

    delimiter $$

    create trigger st_del_xh before delete

    on student

    for each row

    begin

    if (select count(*) from score where 学号=old.学号)>0 then

    signal sqlstate 'HY000'

    set message_text = "Cannot delete or update a child row: a foreign key constraint ...";

    end if;

    end$$

    create trigger st_up_xh before update

    on student

    for each row

    begin

    if (select count(*) from score where 学号=old.学号)>0 then

    signal sqlstate 'HY000'

    set message_text = "Cannot delete or update a child row: a foreign key constraint ...";

    end if;

    end$$

    delimiter ;

    c931bb4d8fc0482296b4d229.html

    c931bb4d8fc0482296b4d229.html

    展开全文
  • Mysql(数据库完整性

    千次阅读 2021-01-19 08:37:16
    关系模型有三种完整性约束:实体完整性,参照完整性和用户定义的完整性。1、实体完整性实体完整性是指,如果一个表的属性被确定为主属性,那么这个属性就不能取空值。实体完整性用于区分不同的实体,如果取空值就...

    关系模型有三种完整性约束:实体完整性,参照完整性和用户定义的完整性。

    1、实体完整性

    实体完整性是指,如果一个表的属性被确定为主属性,那么这个属性就不能取空值。实体完整性用于区分不同的实体,如果取空值就缺少了用于区分不同实体的条件。另外,因为实体是惟一的,因此主属性不能重复。

    (1)主属性唯一:

    例如,在未设置主键约束前,可以执行两次插入语句:

    INSERT INTO Student

    VALUES('0922278926','李翔','男','1998-2-3','090501','675','13456734522','Lixiang@sina.com')

    2282f9ce7d6c0733a680eaf3346b6414.png

    这在现实生活中是不被允许的,因为就算一个人的姓名、出生日期等信息都相同,学号应该是惟一的,用它来区分不同的学生。

    (2)主属性为空:

    例如,插入一条学生信息,将学生的学号设置为空:

    INSERT INTO Student

    VALUES('','李翔','男','1998-2-3','090501','675','13456734522','Lixiang@sina.com')

    af042a7b4db1901e8eeb46804a08ede7.png

    在没有主键约束的情况下,虽然信息为空,依旧能够插入学生的信息,这样也是不合理的。

    通过以上例子可以看出设置主键约束是十分必要的。

    (3)设置主键约束:

    在建表后设置:

    ALTER TABLE Student

    ADD CONSTRAINT pk_student_studentno PRIMARY KEY(studentno)

    在建表时设置:

    设置主属性为not null ,再加上PRIMARY KEY(主属性)

    添加主键约束后,如果添加主属性为空或主属性重复的信息就会报错。

    (4)删除主键约束

    ALTER TABLE Student

    DROP PRIMARY KEY;

    2、参照完整性:

    (1)主表与从表

    主表与从表是一对多的关系,主表约束从表,其中主表是一,从表是多。

    (2)参照完整性:

    参照完整性使两个表建立了联系:

    例如:在课程和分数表中:

    课程表:

    8a1eb836d0ef111534cf9dd0a3c38607.png

    分数表:

    09494dbafc316e7704ae0f7e7441b60b.png

    课程表中courseno设置为主键,而在分数表中courseno不是主键,因此courseno是分数表的外键。如果一个学生的分数信息中有courseno的值在课程表中找不到,这是不被允许的,难道还存在有分数学校却没有开的课?

    因此:为了保持参照完整性,应遵守以下规则:

    a、添加或修改分数表中的信息时,必须保证courseno的值在课程表中能够找到。

    b、添加或修改课程表中的信息时,必须保证score表中已有的courseno不能在课程表中丢失。

    (3)建立参照完整性

    a、在建表时直接添加参照完整性:

    b、建表后添加:

    ALTER TABLE score

    ADD CONSTRAINT FOREIGN KEY(courseno)

    REFERENCES course(courseno)

    3、用户自定义的完整性

    (1)UNIQUE约束

    ALTER TABLE student

    ADD CONSTRAINT uk_student_studentno UNIQUE(studentno)

    删除约束:

    ALTER TABLE student

    DROP INDEX uk_student_studentno

    (2)CHECK约束:

    ALTER TABLE student//规定入学成绩的范围

    ADD CONSTRAINT ck_stu_point CHECK(POINT>=200 AND POINT<=900)

    mysql可以设置check约束,但是无效。

    (3)非空约束:

    ALTER TABLE student

    MODIFY POINT SMALLINT(6) NOT NULL

    删除:

    ALTER TABLE student

    MODIFY POINT SMALLINT(6) NULL

    展开全文
  • 原标题:MySQL中的数据完整性约束作者:Airy 在数据分析之路狂奔,立志成为大咖级人物。前面已经学习了常用数据类型和表的操作,其中表的操作中提到了数据完整性约束条件,今天来详细说一下各种完整性约束条件。关系...

    原标题:MySQL中的数据完整性约束

    作者:Airy 在数据分析之路狂奔,立志成为大咖级人物。

    前面已经学习了常用数据类型和表的操作,其中表的操作中提到了数据完整性约束条件,今天来详细说一下各种完整性约束条件。

    关系模型的完整性规则是对关系的某种约束条件。对关系模型施加完整性约束,是为了在数据库应用中保障数据的正确性和一致性,防止数据库中存在不符合语义、不正确的数据,这也是数据库服务器最重要的功能之一。

    完整性约束既能防止对MySQL数据库的以外破坏和非法存取,又能提高完整性检测效率,也能减轻我们的负担。下面说一下关系模型中的三类完整性约束。

    定义实体完整性

    实体完整性规则(Entity Integrity Rule)是指关系的主属性不能取空值,即主键和候选键在关系中所对应的属性都不能取空值。MySQL中实体完整性就是通过主键约束和候选键约束来实现的。

    1、主键约束

    主键是表中某一列或某些列所构成的一个组合。能够唯一地标识表中的一条记录。主键约束(Primary Key Constraint)要求主键列的数据唯一,且不允许为空。

    主键约束实现的两种方式:

    一种是列级完整性约束,在表中某个字段定义后加上关键字PRIMARY KEY即可。如studentNo char(10) PRIMARY KEY,。

    一种是表级完整性约束,需要在表中所有字段定义最后添加一条PRIMARY KEY(index_col_name, ...)。如PRIMARY KEY(studentNo)。

    比如我们重新创建学生表:

    CREATE TABLE tb_student(

    studentNo CHAR(10) PRIMARY KEY,

    studentName VARCHAR(20) NOT NULL,

    sex CHAR(2),

    birthday DATE,

    native VARCHAR(20),

    nation VARCHAR(20),

    classNo CHAR(6)

    )ENGINE=InnoDB;

    2、完整性约束的命名

    与数据库中的表一样,可以对完整性约束进行添加、删除和修改等操作。首先需要在定义约束时对其进行命名,命名完整性约束的方法是,在各种完整性约束的定义说明之前加关键字CONSTRAINT和该约束的名字,语法格式如下:

    CONSTRAINT

    {PRIMARY KEY (主键字段列表)

    |UNIQUE (候选键字段列表)

    | FOREIGN KEY (外键字段列表) REFERENCES tb_被参照关系(主键字段列表)

    |CHECK(约束条件表达式)};

    说明:symbol为指定的约束名字,必须是唯一的,默认MySQL会自动创建一个约束名字。

    3、候选键约束

    与主键一样,候选键可以是表中的某一列,也可以是表中某些列构成的一个组合。任何时候,候选键的值必须是唯一的,且不能为NULL,候选键可在CREATE TABLE 或ALTER TABLE语句中使用关键字UNIQUE来定义,实现方法与主键类似。看一个例子,创建班级表。

    CREATE TABLE tb_class(

    classNo CHAR(6) PRIMARY KEY,

    className VARCHAR(20) NOT NULL UNIQUE,

    department VARCHAR(30) NOT NULL,

    grade SMALLINT,

    classNum TINYINT

    )ENGINE=InnoDB;

    或者直接放在所有字段之后:CONSTRAINT UQ_class UNIQUE(className)。

    MySQL中PRIMARY KEY 和UNIQUE之间的区别:

    一个表只能创建一个PRIMARY KEY,但是可以定义多个UNIQUE。

    定义PRIMARY KEY的列不允许有空值,定义UNIQUE的字段允许空值的存在。

    定义PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引,而定义UNIQUE约束时,系统自动产生UNIQUE索引。

    定义参照完整性

    关系模型中实体与实体间的联系都是用关系来描述,因此可能存在着关系与关系间的引用。外键是一个表中的一个或一组属性,他不是这个表的主键,但是它对应另一个表的主键,外键的主要作用就是保证数据引用的完整性,保持数据的一致性。

    参照完整性规则(Referential Integrity Rule)定义的是外键与主键之间的引用规则,即外键的取值或者为空,或者等于被参照关系中某个主键的值。

    下面修改一下前面的学生表。

    DROP TABLE tb_student;

    CREATE TABLE tb_student(

    studentNo CHAR(10),

    studentName VARCHAR(20) NOT NULL,

    sex CHAR(2),

    birthday DATE,

    native VARCHAR(20),

    nation VARCHAR(20),

    classNo CHAR(6) REFERENCES tb_class(classNo),

    CONSTRAINT PK_student PRIMARY KEY(studentNo)

    )ENGINE=InnoDB;

    前面已经创建了表tb_class,而且classNo是主键,这里学生表里可以设置为外键,这个值参照班级表的主键classNo的值。

    PS.外键只能引用主键和候选键。外键只可以用在使用存储引擎InnoDB创建的表中,其他的存储引擎不支持外键。

    用户定义的完整性

    除了前面两种完整性之外,还有一种特殊的约束条件,即用户定义的完整性规则(User-definedIntegrity Rule),它反映了某一具体应用所涉及的数据应满足的语义要求。

    MySQL支持以下几种用户自定义完整性约束:

    1、设置非空约束

    非空约束是指设置的字段的值不能为空。比如之前我们添加的字段:studentNameVARCHAR(20) NOT NULL,中就设置了非空约束。

    2、CHECK约束

    与非空约束一样,也是在创建表或修改表的同时来定义的。CHECK约束需要指定限定条件,CHECK的语法是CHECK(expr);下面看一下实例,我们来创建一个课程表tb_course,并且设置约束,每16个课时对应1学分。

    CREATE TABLE tb_course(

    courseNo CHAR(10),

    courseName VARCHAR(20) NOT NULL,

    credit INT NOT NULL,

    courseHour INT NOT NULL,

    term CHAR(2),

    priorCourse CHAR(6),

    CONSTRAINT PK_course PRIMARY KEY(courseNo),

    CONSTRAINT FK_course FOREIGN KEY(priorCourse)

    REFERENCES tb_course(courseNo),

    CONSTRAINT CK_course CHECK(credit= courseHour/16)

    )ENGINE=InnoDB;

    更新完整性约束

    1、删除约束

    DROP TABLE会删除所有完整性,但是并不经常这样做。看一下单独删除的语法。

    删除外键约束

    ALTER TABLE DROP FOREIGN KEY ;

    删除主键约束

    ALTER TABLE DROP PRIMARY KEY;

    删除候选键约束

    ALTER TABLE DROP {约束名|候选键字段名};

    2、添加约束

    添加主键约束

    ALTER TABLE ADD [CONSTRAINT] PRIMARY KEY(主键字段);

    添加外键约束

    ALTER TABLE ADD [CONSTRAINT] FOREIGNKEY (外键字段) REFERENCES 被参照表(主键字段名);

    添加候选键约束

    ALTER TABLE ADD [CONSTRAINT] UNIQUE KEY(字段名);

    大家可以手动测试一下。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 数据完整性实例 创建数据库schoolDB2和三张表 --创建学生表 CREATE TABLE `TStudent` ( `StudentID` varchar(15) NOT NULL, `Sname` varchar(10) DEFAULT NULL, `sex` char(1) DEFAULT NULL, `cardID` varchar(20) ...
  • 完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作..完整性约束是对字段进行限制,从而符合该字段达到...
  • SQL 数据库完整性

    2021-04-19 11:16:11
    文章目录实体完整性定义实体完整性实体完整性检查和违约处理 实体完整性 定义实体完整性 关系模型的实体完整性在CREATE TABLE中用PRIAMRY KEY来定义。 对单属性构成的码有:列级约束条件、表级约束条件 对多个属性...
  • 如何添加数据完整性在创建表时给表中添加约束完整性分类实体完整性完整性参照完整性实体完整性什么是实体完整性表中的一行(一条记录)代表一个实体(entity)实体完整性的作用标识每一行数据不重复。行级约束约束类型...
  • 掌握完整性控制的方法。 1.熟悉和掌握对数据表中视图的定义操作和SQL命令的使用; 2.熟悉和掌握对数据表中视图的查询操作和SQL命令的使用; 3.熟悉和掌握对数据表中视图的更新操作和SQL命令的使用,并注意视图更新与...
  • 文章目录数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.3.1 属性上的约束条件5.3.2 元组上的约束条件5.4 完整性约束命名子句1.完整性约束命名子句2. 修改表中的完整性限制5.6 断言 数据库完整性 ...
  • MySQL表级完整性约束

    2021-04-10 19:05:44
    MySQL表级完整性约束 为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供 了一种机制来检查数据库是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制 就是...
  • 完整性约束完整性约束是为了表的数据的正确性!如果数据不正确,那么一开始就不能添加到表中。1 主键当某一列添加了主键约束后,那么这一列的数据就不能重复出现。这样每行记录中其主键列的值就是这一行的唯一标识...
  • 关系的完整性约束 实体完整性(Entity integrity) 主属性不能为空值(即任一候选码的属性不能为空) 在实际上,只用到主码,即主码属性不为空就好 参照完整性(Referential integrity) 这是对外部码的约束: 外部码...
  • 【其它】实验六 数据库完整性 1 实验目的 熟悉和掌握 SQL 对数据库进行完整性控制的方法。 2 实验平台 2.1 操作系统: Windows 2000 或者 Windows XP 2.2 SQL Server 2000 3 实验要求 已知数据库 SSC (学生选课)由下...
  • 数据库的完整性   数据的正确性:数据是符合现实世界语义,反映了当前实际状况的   数据的相容性:同一对象在不同关系表中的数据是符合逻辑的 【例如】 (1)学生的学号必须唯一 (2)性别只能是男或女 (3)本科学生...
  • 文章目录1 数据的完整性作用2 完整性的分类2.1 实体完整性2.1.1 主键约束 primary key2.1.2 唯一约束 unique2.1.3 自动增长列 auto_increment2.2 域完整性2.2.1 非空约束 not null2.2.2 默认值约束 default2.2.3 ...
  • 熟练掌握基本表的各种完整性定义的方法。 掌握用户的创建以及使用方法。 掌握SQL语句对数据库和表进行安全控制的方法。 实验内容 利用图形用户界面对Student库中,增加以下的约束和索引,并验证违反相关完整性时的...
  • 【判断题】在MySQL关系模型中,实体完整性是指一个基本表必须有主键(关键字),即对主键的约束。【填空题】The computer's entire ____ was on a single board.【填空题】Task 2 Fill in the blanks with words chosen ...
  • 实验一~~四,于https://blog.csdn.net/weixin_44318248/category_8883986.html 实验五:数据库安全性与完整性 实验内容与完成情况(记录所有的实验过程): 1.建立用户U1、U2、U3、U4、U5、U6、U7,用户映射的数据库为...
  • 本篇主要总结第5章数据库完整性例题的前一部分,主要内容是三大完整性。数据库的完整性是指数据的正确性和相容性。 数据的正确性 数据是符合现实世界语义 ,反映了当前实际状况的 数据的相容性 同一对象在不同关系...
  • 1. 利用图形用户界面对实验一中所创建的Student库中,增加以下的约束和索引,并验证违反相关完整性时的数据库系统的违约处理。(10分) 略 2. 利用图形用户界面针对实验一中所创建的Student库,给SC表添加外键约束,...
  • 数据库完整性5.1实体完整性5.1.1定义实体完整性5.1.2 实体完整性检查和违约处理5.2参照完整性5.2.1定义参照完整性5.2.2 参照完整性检查和违约处理5.3 用户定义的完整性5.3.1 属性上的约束条件5.3.2 元组上的约束条件...
  • 数据库完整性2. 实体完整性3. 参照完整性4. 用户定义的完整性4.1 属性上的约束条件4.2 元组(行)上的约束条件5. 完整性约束命名子句(CONSTRAINT)6. 断言(assertion)7. 触发器 1. 数据库完整性 有时候虽然数据...
  • --[例4.14] 建立计算机系学生的视图,把对该视图的SELECT限授于王平,把该视图上的所有操作权限授于张明。 1. 先建立计算机系学生的视图CS_Student CREATE VIEW CS_Student AS SELECT * FROM Student WHERE Sdept=...
  • 为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,808
精华内容 33,523
关键字:

学生是完整性的人