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约束,具有唯一性,不可重复!
posted on 2022-03-17 17:08  小熊冰淇淋  阅读(34)  评论(0编辑  收藏  举报