美文网首页
SQL学习笔记——约束(重要!!!)

SQL学习笔记——约束(重要!!!)

作者: 芥末海苔QAQ | 来源:发表于2022-06-02 09:13 被阅读0次

    约束(重要!!!)

    约束:在创建表时给表中的字段加上一些约束,来保证表中数据的完整性,有效性

    类型:

    非空约束:not nul
    唯一性约束:unique
    主键约束:primary key (简称PK)
    外键约束:foreign key (简称FK)
    检查约束:check (mysql不支持,oracle支持)

    • 非空约束:not nul

    约束的字段不能为空(NULL)
    not null只有列级约束,没有表级约束

    例:
    drop table if exists t_vip;
    create table t_vip(
      id int,
      name varchar(255) not null
    );
    insert into t_vip(id,name) values(1,'zhangsan');
    insert into t_vip(id,name) values(2,'lisi');

    有了非空约束,加入字段值为空就会报错
    insert into t_vip(id) values(3);

    • 唯一性约束:unique

    约束的字段不能重复,但是可以为NULL
    drop table if exists_vip
    create table t_vip(
      id int,
      name varchar(255) unique,
      enail varchar(255)
    );
    insert into t_vip (id,name,email) values (1,'zhangsan','zhangsan@123.com');
    insert into t_vip (id,name,email) values (2,'lisi','lisi@123.com');
    insert into t_vip (id,name,email) values (3,'wangwu','wangwu@123.com');
    insert into t_vip (id,name,email) values
    (4,'wangwu','wangwu@sina.com');  //插入‘wangwu’重复,报错

    可以为null,不算重
    • 列级约束,约束直接加在列后面的
      create table t_vip{
        id int,
        name varchar(255) unique,
        email varchar(255) unique
      };

    • 表级约束,约束没有添加在列后面,
      name和email两个字段联合起来唯一性
      使用场景:需要给多个字段联合起来添加某一约束的时候,需要使用表级约束

    create table t_vip{
      id int,
      name varchar(255),
      email varchar(255),
      unique(name,email)
    };
    insert into t_vip (id,name,email) values (1,'zhangsan',zhangsan@123.com);
    insert into t_vip (id,name,email) values (2,'zhangsan',zhangsan@sina.com);
    这两条都能加入,因为name和email联合起来不相同

    unique和not null联合使用
    create table t_vip{
      id int,
      name varchar(255) not null unique
    };

    PRI:primary key

    在mysql中,一个字段被not null 和 unique 联合约束后,自动变成成主键字段。(oracle不一样)

    insert into t_vip(id,name) values (1,'zhangsan');
    insert into t_vip(id,name) values (2,'zhangsan'); //错误,name重复
    insert into t_vip(id) values (2); //错误,name不能为NULL

    • 主键约束 (primary key,简称pk)重要!!!

    主键约束:约束名
    主键字段:添加了主键约束的字段
    主键值:主键字段中的每个值都要做主键值

    作用:
    主键值是每一行记录的唯一标识。
    实际开发中两条记录可能一样,需要通过主键值来区分
    (相当于人员表中两个人姓名,性别一样,需要靠身份证区别)

    任何一张表都应该有主键。没有主键,表无效!
    主键特征:not null + unique(主键值不能是NULL,同时也不能重复!!!)
    一个字段做主键叫:单一主键
    写法一:
    drop table if exists t_vip;
    create table t_vip{
      id int primary key,
      name varchar(255)
    };

    写法二:
    drop table if exists t_vip;
    create table t_vip{
      id int,
      name varchar(255),
      primary key(id) //表级约束
    };

    insert into t_vip(id,name) values(1,'zhangsan');
    insert into t_vip(id,name) values(2,'lisi');
    insert into t_vip(id,name) values(2,'wangwu'); //错误,不能重复
    insert into t_vip(name) values('zhaoliu'); //错误,不能为空

    表级约束主要是给多个字段联合起来添加约束,
    多个字段联合起来做主键叫:复合主键
    PS:实际开发中不建议使用复合主键
    主键存在的意义就是单条记录的身份证号,意义达到即可
    drop table if exists t_vip;
    create table t_vip{
      id int,
      name varchar(255),
      email varchar(255),
      primary key(id,name) //表级约束
    };
    insert into t_vip(id ,name,email) values(1,'zhangsan','zhangsan@123.com');
    insert into t_vip(id ,name,email) values(1,'lisi','lisi@123.com');

    一张表主键约束只能添加一个

    主键值建议使用:
    int
    bigint
    char

    等类型
    不建议使用:varchar。主键值一般是定长的数字

    主键除了按单一主键和复合主键分类之外,
    还可以按
    自然主键:主键值是一个自然数,跟业务没关系
    业务主键:主键值和业务紧密关联,例如拿银行卡号做主键值
    实际开发中使用自然主键比较多,因为主键只要做到不重复就行,不需要有意义,
    业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动时,可能会影响到主键值

    mysql中,有一种机制,可以帮助我们自动维护一个主键值
    drop table if exists t_vip;
    create table t_vip{
      id int primary key auto_increment, //自增
    name carchar(255)
    };
    insert into t_vip(name) values ('zhangsan');
    insert into t_vip(name) values ('zhangsan');
    insert into t_vip(name) values ('zhangsan');
    ...

    主键可以采用自增的方式生成:auto_increment,从1开始


    外键约束(foreign key,简称FK)非常重要!!!!!!

    外键约束:foreign key
    外键字段:该字段上添加了外键约束
    外键值:外键字段当中的每一个值

    业务背景:
    例:设计数据库表,来描述“班级和学生”的信息
    方法一:班级和学生存储在一张表中(失败)
    t_student

    no(pk) name classno calssname
    1 jack 100 北京市大兴区亦庄镇第二中学高三1班
    2 lucy 100 北京市大兴区亦庄镇第二中学高三1班
    3 lilei 100 北京市大兴区亦庄镇第二中学高三1班
    4 hanmeimei 101 北京市大兴区亦庄镇第二中学高三2班
    5 zhangsan 101 北京市大兴区亦庄镇第二中学高三2班
    6 lisi 101 北京市大兴区亦庄镇第二中学高三2班
    7 wangwu 101 北京市大兴区亦庄镇第二中学高三2班
    8 zhaoliu 101 北京市大兴区亦庄镇第二中学高三2班

    缺点:数据冗余,空间浪费

    方法二:班级一张表,学生一张表
    t_class:班级表 (父表)

    classno(pk) calssname
    100 北京市大兴区亦庄镇第二中学高三1班
    101 北京市大兴区亦庄镇第二中学高三2班

    t_student:学生表 (子表)

    no(pk) name cno(FK,引用t_class这张表的classno)
    1 jack 100
    2 lucy 100
    3 lilei 100
    4 hanmeimei 100
    5 zhangsan 101
    6 lisi 101
    7 wangwu 101
    8 zhaoliu 101

    当cno字段没有约束时,可能会导致数据无效,可能出现102,但102班级不存在,
    所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束,
    cno字段是外键字段,cno字段中的每一个值都是外键值

    删表顺序:先删子表,再删父表
    建表顺序:先建父表,再建子表
    删除数据:先删子,再删父
    插入数据:先插父,再插子

    drop table if exists t_student;
    drop table if exists t_class;

    create table t_class(
      classno int primary key,
      classname varchar(255)
    );
    create table t_student(
      no int primary key auto_increment,
      name varchar(255),
      cno int,
      foreign key (cno) references t_class(classno)
    );

    insert into t_class (classno,classname) values(100,'北京市大兴区亦庄镇第二中学高三1班');
    insert into t_class (classno,classname) values(101,'北京市大兴区亦庄镇第二中学高三2班');
    insert into t_student (name,cno) values('jack',100);
    insert into t_student (name,cno) values('lucy',100);
    insert into t_student (name,cno) values('lilei',100);
    insert into t_student (name,cno) values('hanmeimei',100);
    insert into t_student (name,cno) values('zhangsan',101);
    insert into t_student (name,cno) values('lisi',101);
    insert into t_student (name,cno) values('wangwu',101);
    insert into t_student (name,cno) values('zhaoliu',101);

    子表中的外键引用父表中的某个字段,被引用的这个字段不一定是主键,但至少又unique约束(否则不知道用的是哪个)
    外键值可以为NULL

    相关文章

      网友评论

          本文标题:SQL学习笔记——约束(重要!!!)

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