美文网首页程序员
Python 高级 14(3)数据库约束

Python 高级 14(3)数据库约束

作者: Cestine | 来源:发表于2018-11-28 19:31 被阅读2次

    数据库常用约束、增加删除约束、数据库导入导出、数据表设计思想-三大范式

    2.4.8 添加约束

    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的准确性,完整性、唯一性,可靠性、联动性。

    设置外键约束字段所关联的字段,必须是主键约束字段。

    就是说必须是主键约束字段才能给其他字段设置外间约束!

    数据库常用约束总结:

      <1>主键约束

          作用:让数据具有唯一标识,一般设置ID字段,一个表中只能有一个主键字段

          语法:primary key

              ■ create table 表名(字段名 字段类型 primary key);

              ■ create table tpk(id int primary key , name char(10));

          注意:

              ■ 字段被设置了主键约束,同时也具有了唯一性约束和非空约束。 在字段中插入重复数据时,或不给数据时会报错。

      <2>自动增长

          作用:让数值类型字段数字值自动累加,需要配合主键使用

          语法:auto_increment

              ■ create table 表名(字段名 字段类型 auto_increment primary key);

              ■ create table tai(id int auto_increment primary key,name varchar(10));

          注意:

              ■ 自动增长设置在数值型字段上,需要配合主键约束一起使用。 如果字段没有设置主键约束,是不允许设置自动增长的。

      <3>唯一性约束

          作用:保证数据的唯一性,不会出现重复数据

          语法:unique

              ■ create table 表名(字段名 字段类型 unique);

              ■ create table tuni(id int unique,name char(10));

          注意:

              ■ 一个表中可以给多个字段设置唯一性,如果有需要的话。

      <4>非空约束

          作用:不允许字段为空,添加数据时必须给值

          语法:not null

              ■ create table 表名(字段名 字段类型 not null);

              ■ create table tnn(id int,name char(10) not null);

      <5>默认约束

          作用:在添加数据时,如果没有给定有默认约束字段的数据,该字段使用默认值填充

          语法:default

              ■ create table 表名(字段名 字段类型 default 值);

              ■ create table tdt(id int,name char(10) default 'NoName');

      <6>外键约束

          作用:让两表之间产生联动关系,为两表建立引用参考关系

          语法:foreign key(字段名) references 表名(字段名)

              ■ create table 表名(字段名 字段类型… , foreign key(外键字段名) references 关联表名(关联字段名);

              ■  -- 表1

    create table fClass(id int primary key,name char(10));

    -- 表2

    create table fStudent(id int primary key auto_increment, name char(10), cid int, foreign key(cid) references fClass(id));

          注意:

              ■ 设置外键约束字段所关联的字段,必须是主键约束字段。

                  也就是说只能用主键约束字段给其他字段设置外键约束!

              ■ 想要删除有设置外键的表,必须先删除外键所关联的表。

                  drop table fStudent;

                  drop table fClass;

      <7>检查约束(在MySQL中无效,不起作用,但其它数据库中有效)

          作用:设置字段的域范围,也就是有效值范围

          语法:check(值范围条件)

              ■ create table 表名(字段名 字段类型 check(值范围条件));

              ■ create table tchk(id int,age int check(age > 0 and age < 150),gender char(10) check('boy' or 'girl'));

      <8>unsigned

          作用:unsigned属性是将数字类型无符号化,也就是非负数,只用于整型。特别用于主键是自增的类型。

          语法:unsigned

              ■ create table 表名(字段名 int unsigned);

              ■ create table tpk(id int unsigned);

    增加删除约束总结:

    添加约束前应该保证该字段上没有新添加的约束 删除约束前应该保证该字段上有这个约束

      <1>添加主键约束

          语法:alter table 表名 add constraint 约束名 primary key(字段名)

          alter table tpk add constraint PK_id primary key(id);

          注意:

              ■ 主键约束名一般以PK_字段名来命名

      <2>删除主键约束

          因为一个表中最多只能有一个主键约束,所以可以直接删除

          语法:alter table 表名 drop primary key

          alter table tpk drop primary key;

      <3>添加外键约束

          语法:alter table 表名 add constraint 外键约束名 foreign key(外键字段名) references 关联表(关联字段名)

          alter table tfk add constraint FK_id foreign key (id) references tpk(id);

          注意:

              ■ 外键约束名一般以FK_字段名来命名

      <4>删除外键约束

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

          alter table tfk drop foreign key FK_id;

    1.没有对字段设置约束时容易出现的问题

      <1>数据冗余

      <2>失去数据完整性

      <3>数据缺少唯一标识

      <4>失去实体完整性

      <5>失去域完整性

      <6>失去引用完整性

    <1>数据冗余

    两个表中都存在学生姓名,没有必要。

    <2>失去数据完整性

    <3>数据缺少唯一标识

    <4>失去实体完整性

    <5>失去域完整性

    <6>失去引用完整性

    2.数据库常用约束

      <1>主键约束

          作用:让数据具有唯一标识

          语法:primary key

              ■ create table tpk(id int primary key , name char(10));

          注意:

              ■ 字段被设置了主键约束,同时也具有了唯一性约束和非空约束。 在字段中插入重复数据时,或不给数据时会报错。

      <2>自动增长

          作用:让数字值自动累加

          语法:auto_increment

              ■ create table tai(id int auto_increment primary key,name varchar(10));

          注意:

              ■ 自动增长设置在数值型字段上,需要配合主键约束一起使用。 如果字段没有设置主键约束,是不允许设置自动增长的。

      <3>唯一性约束

          作用:保证数据的准确性,不会出现重复数据

          语法:unique

              ■ create table tuni(id int unique,name char(10));

          注意:

              ■ 一个表中可以给多个字段设置唯一性,如果有需要的话。

      <4>非空约束

          作用:不允许字段为空,添加数据时必须给值

          语法:not null

              ■ create table tnn(id int,name char(10) not null);

      <5>默认约束

          作用:在添加数据时,如果没有给定有默认约束字段的数据,该字段使用默认值填充

          语法:default

              ■ create table tdt(id int,name char(10) default 'NoName');

      <6>外键约束

          作用:让两表之间产生联动关系

          语法:foreign key(字段名) references 表名(字段名)

              ■  -- 表1

    create table fClass(id int primary key,name char(10));

    -- 表2

    create table fStudent(id int primary key auto_increment, name char(10), cid int, foreign key(cid) references fClass(id));

          注意:

              ■ 设置外键约束字段所关联的字段,必须是主键约束字段。

              ■ 想要删除有设置外键的表,必须先删除外键所关联的表。

                  drop table fStudent;

                  drop table fClass;

      <7>检查约束(在MySQL中无效,不起作用)

          作用:设置字段的域范围,也就是有效值范围

          语法:check(值范围条件)

              ■ create table tchk(id int,age int check(age > 0 and age < 150),gender char(10) check('boy' or 'girl'));

    2.4.9 增加删除约束

    添加约束前应该保证该字段上没有新添加的约束 删除约束前应该保证该字段上有这个约束

      添加主键约束

          语法:alter table 表名 add constraint 约束名 primary key(字段名)

          alter table tpk add constraint PK_id primary key(id);

      删除主键约束

          因为一个表中最多只能有一个主键约束,所以可以直接删除

          语法:alter table 表名 drop primary key

          alter table tpk drop primary key;

      添加外键约束

          语法:alter table 表名 add constraint 外键约束名 foreign key(外键字段名) references 关联表(关联字段名)

          alter table tfk add constraint FK_id foreign key (id) references tpk(id);

      删除外键约束

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

          alter table tfk drop foreign key FK_id;

    2.4.10 数据库导入导出

    作用:使用数据库和导入导出功能,可以对数据库进行备份,迁移等操作。

    总结:

      导出

          mysqldump –uroot –p(注意不要输入密码) 要导出的数据库名 要导出的数据表 ... > 目标文件.sql

      导入

          mysql -uroot -p 数据库名 < 要导入的文件.sql

      导出数据库

          导出数据库使用 mysqldump 命令完成

          语法:mysqldump –uroot –p(注意不要输入密码) 要导出的数据库名 要导出的数据表 ... > 目标文件.sql

      导出整个数据库

          mysqldump -uroot -p School > school_bak.sql

      导出库当中的指定表

          mysqldump -uroot -p School tpk > tpk.sql

      导出库当中的多个表tpk和tfk

          mysqldump -uroot -p School tpk tfk > tpktfk.sql

      导入数据库

          导入数据库前需要先创建一个空数据库

          语法:mysql -uroot -p 数据库名 < 要导入的文件.sql

          mysql -uroot -p sch < school_bak.sql

    2.4.11 数据表设计思想

      需求分析:根据用户的需求,分析出需要记录的数据

      需求设计:根据分析出的数据,设计E-R模型图

      详细设计:将E-R模型图转换成数据表

      三大范式:使用数据库三大范式的设计思想对数据表进行审核(数据库在设计时,需要满足三大范式的设计思想。)

          第一范式 : 每一列都具有原子性,也就是不能再分割

          第二范式 : 每个表只描述一件事情

          第三范式 : 表中不能存在冗余字段

              ■ 非主属性不存在依赖关系

          每一范式的实现都必须要在前一范式的实现基础上

    <1>E-R模型图

    概念:Entity-Relationship,实体关系图 组成元素:

      矩形 表示实体

      椭圆形 表示属性

      菱形 表示关系

    ER图应用案例: 将下面的项目需求 以ER图形式表示出来

    表示关系:

    <2>三大范式(了解)

    数据库在设计时,需要满足三大范式的设计思想。

    三大范式的理论非常抽象,有兴趣可以查阅资料进行了解,

    下面以简单的形式描述三大范式,方便大家有一个简单的概念上的理解。

      第一范式 : 每一列都具有原子性,也就是不能再分割

      第二范式 : 每个表只描述一件事情

          在满足第一范式的基础之上表的属性必须要有主键依赖

      第三范式 : 表中不能存在冗余字段

    2.4.12 数据表练习

      创建数据库 School

          create database School;

      创建学生表 tStudent

          tStudent学生表结构:

          -- sId -- 学生编号 -- sName -- 姓名 -- sAge -- 年龄 -- sGender -- 性别 -- sAddress -- 地址 -- sPhone -- 电话 -- sBirthday -- 生日 -- sCardId -- 身份证号 -- sClassId -- 班级Id

          答案:

          create table tStudent(sId int,sName char(20),sAge tinyint,sGender enum('boy','girl'),sAddress varchar(50),sPhone char(11),sBirthday year,sCardId char(18),sClassid int);

      创建成绩表 tScore TblScore成绩表结构:

          -- sId(成绩id,主键,自动编号) -- sStuId(学生编号) -- sEnglish(英语成绩) -- sMath(数学成绩)

          答案:

              ■ create table tScore(sid int unsigned auto_increment primary key, sStuId int, sEnglish float(5,2), smath float(5,2) );

      创建班级表 tClass tClass班级表结构:

          -- cId –班级ID -- cName –班级名称 -- cDescription –班级描述

          答案:

              ■ create table tClass(cId int,cName char(10),cDescription varchar(100));

      创建老师表 tClass tTeacher老师表:

          -- tTId -- tTName -- tTGender -- tTAge -- tTSalary -- tTBirthday

          答案:

              ■ create table tTeacher(tId int, tName char(20),tAge tinyint,tGender enum('boy','girl'),tSalary float(10,2),tBirthday year);

    相关文章

      网友评论

        本文标题:Python 高级 14(3)数据库约束

        本文链接:https://www.haomeiwen.com/subject/ptgzqqtx.html