程序员

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

2018-11-28  本文已影响2人  Cestine

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

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);

上一篇下一篇

猜你喜欢

热点阅读