数据库学习记录(五)


1.约束

Q:什么是约束?常见的约束有哪些呢?

A:在创建表的时候,可以给表的字段增加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。

常见的约束有哪些呢?

  非空约束 (not null):约束的字段不能为null

  唯一约束 (unique):约束的字段不能重复

  主键约束 (primary key):约束的字段既不能为NULL,也不能重复

  外键约束   (foreign key):...(见之后学习笔记)

  检查约束   (check):oracle有,但是mysql不支持。

案例:给两个列或多个列增加unique

create table t_user {

  id int;

  usercode varchar(255),

  username varchar (255),

  unique (usercode,username) //表级约束

};//联合起来不唯一

create table t_user {

  id int;

  usercode varchar(255)unique,

  username varchar (255)unique  //列级约束

}//均不能唯一

NOT NULL只有列级约束,没有表级约束。

主键约束相关的术语:

  主键约束:primary key 

  主键字段:   id字段添加

  主键值:id字段中的每一个值都是主键值

主键有什么作用?

表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。

主键的作用:主键值是这行记录在这条表中的唯一标识。

一张表的主键约束只能有一个(必须记住)

mysql 提供主键值自增

auto_increment

外键约束:

 关于外键约束的相关术语:

  外键约束:foreign key

  外键字段:添加有外键的字段

  外键值:外键字段中的每一个值  

      业务背景:       请设计数据库表,用来维护学生和班级的信息?           第一种方案:一张表存储所有数据       no(pk)          name          classno         classname       -----------------------------------------------------------        1               zs1            101          河南省平顶山市舞钢市垭口一高高三1班                2               zs2            101          河南省平顶山市舞钢市垭口一高高三1班        3               zs3            102          河南省平顶山市舞钢市垭口一高高三2班        4               zs4            102          河南省平顶山市舞钢市垭口一高高三2班        5               zs5            102          河南省平顶山市舞钢市垭口一高高三2班        缺点:冗余。【不推荐】          第二种方案:两张表(班级表和学生表)          t_class 班级表        cno(pk)         cname        -------------------------------------------------------------             101           河南省平顶山市舞钢市垭口一高高三1班         102           河南省平顶山市舞钢市垭口一高高三2班           t_student 学生表         sno(pk)        sname          classno(该字段添加外键约束fk)         -----------------------------------------------------------          1              zs1              101          2              zs2              101          3              zs3              102          4              zs4              102          5              zs5              102      * 将以上表的建表语句写出来:              t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。               删除数据的时候,先删除子表,再删除父表。       添加数据的时候,先添加父表,再添加子表。       创建表的时候,先创建父表,再创建子表。       删除表的时候,先删除子表,再删除父表。      drop table if exists t_student;    drop table if exists t_class;      create table t_class(        cno int,        cname varchar(255),        primary key(cno)      );       create table t_student(         sno int,     sname varchar(255),     classno int,     primary key(sno),     foreign key(classno) references t_class(cno)       );           insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');     insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');       insert into t_student values(1,'zs1',101);     insert into t_student values(2,'zs2',101);     insert into t_student values(3,'zs3',102);     insert into t_student values(4,'zs4',102);     insert into t_student values(5,'zs5',102);     insert into t_student values(6,'zs6',102);     select * from t_class;     select * from t_student;       insert into t_student values(7,'lisi',103);  //编译错误,引用的103,父表中没有该字段!     ERROR 1452 (23000) : Cannot add or update a child row :aforeign key constraint fails (bjpowernode INT YT......)     * 外键值可以为NULL?       外键可以为null。     * 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?       注意:被引用的字段不一定是主键,但至少是具有unique约束,具有唯一性,不可重复!