美文网首页
④MySQL之约束一

④MySQL之约束一

作者: SimonLike | 来源:发表于2021-09-07 08:27 被阅读0次

    1,约束(Constraint)

    1.1,什么是约束?常见的约束有哪些?
    在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
    常见的约束:
        非空约束(not null):约束的字段不能为NULL
        唯一约束(unique):约束的字段不能重复
        主键约束(primary key):约束的字段不既不能为NULL,也不能重复(简称PK)
        外键约束(foreign key):...(简称FK)
        检查约束(check):注意Oracle数据库有check约束,目前mysql不支持该约束。
    
    1.2,非空约束 not null
    not null约束只有列级约束,没有表级约束。
    
        drop table if exists t_user;
        create table t_user(
            id int,
            username varchar(255) not null,
            password varchar(255)
        );
        insert into t_user(id,password) values(123,'123456');
        // ERROR 1364 (HY000): Field 'username' doesn't have a default value
    
        insert into t_user values(1234,'xiaohua','233333');
    
    1.3,唯一性约束(unique)
    唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL。
    
        drop table if exists t_user;
        create table t_user(
            id int,
            username varchar(255) unique,
            password varchar(255)
        );
    
        // 不能重复
        insert into t_user values(1234,'xiaohua','233333');
        insert into t_user values(1234,'xiaohua','233333');
        // ERROR 1062 (23000): Duplicate entry 'xiaohua' for key 't_user.username'
    
        //可以为NULL。
        insert into t_user(id) values(2);
        insert into t_user(id) values(3);
        insert into t_user(id) values(4);
    
    
    给2个列或多个列添加unique
    unique(usercode,username);表示usercode,username两个字段联合起来不能重复;【表级约束】
        drop table if exists t_user;
        create table t_user(
            id int,
            usercode varchar(255),
            username varchar(255),
            unique(usercode,username)
        );
        insert into t_user values(1,'111','zs');
        insert into t_user values(2,'111','ls');
        insert into t_user values(3,'222','zs');
        select * from t_user;
    
        insert into t_user values(3,'111','zs');
        // ERROR 1062 (23000): Duplicate entry '111-zs' for key 't_user.usercode'
    
    
    unique出现usercode,username等字段后面是给字段添加唯一性约束【列级约束】
        drop table if exists t_user;
        create table t_user(
            id int,
            usercode varchar(255) unique,
            username varchar(255) unique
        );
        insert into t_user values(1,'111','zs');
        insert into t_user values(2,'111','ls');
        //ERROR 1062 (23000): Duplicate entry '111' for key 't_user.usercode'
    
    1.4,主键约束:(一张表的主键约束只能有一个)
    primary key主键约束:不能重复,也不能为NULL。
    列级主键约束写法:字段 字段类型 primary key
    标记主键约束写法:primary key(字段1,字段2,...)
    
        drop table if exists t_user;
        create table t_user(
            id int primary key,
            username varchar(255) unique,
            email varchar(255)
        );
        insert into t_user values(1,'zs','zs@123.com');
        insert into t_user values(2,'ls','ls@123.com');
        insert into t_user values(3,'zsl','zsl@123.com');
        select * from t_user;
    
        insert into t_user values(1,'jack','jack@123.com');
        // ERROR 1062 (23000): Duplicate entry '1' for key 't_user.PRIMARY'
        insert into t_user(username,email) values('jack','jack@123.com');
        // ERROR 1364 (HY000): Field 'id' doesn't have a default value
        根据以上测试得出:id添加了主键约束,主键字段中的数据不能重复,也不能为NULL。
    
    主键的作用:
        表的设计三范式中,第一范式就是要求任何一张表都应该有主键。
        主键值是这行记录在这张表当中的唯一标识。
    
    主键的分类
        根据主键字段的字段数量来划分:
            单一主键:推荐使用,常用的
            复合主键:多个字段联合起来添加一个主键约束(不建议使用,复合主键违背三范式)
        根据主键的性质来划分:
            自然主键:主键值最好就是一个和业务没有任何关系的自然数。
            业务主键:主键值和系统的业务挂钩,例如:银行卡卡号,身份证号。 不建议使用,因为以后的业务一旦发生改变,
                    主键可能也需要随着发生改变,但有时候没办法改变,因为改变可能会导致主键值重复。
    
    mysql提供的主键值自增长:
        auto_increment:设置一个主键自增长,从1开始,以1递增.
    
        drop table if exists t_user;
        create table t_user(
            id int primary key auto_increment,
            username varchar(255)
        );
        insert into t_user(username) values('a');
        insert into t_user(username) values('b');
        insert into t_user(username) values('c');
        insert into t_user(username) values('d');
        insert into t_user(username) values('e');
        select * from t_user;
    
    1.5,外键约束
    关于外键约束的相关术语:
        外键约束:foreign key
        外键字段:添加有外键约束的字段
        外键值:外键字段中的每一个值。
    外键可以为NULL
    外键引用其他表字段的时候,被引用的字段不一定是主键,但只要要有唯一性(unique)约束。
    
    业务场景:请设计数据库表,用来维护学生和班级信息:
    设计两张表(班级表和学生表):
        班级表(t_class)包含信息:
            cno:(pk主键)班级编号
            cname:班级名称
    
        学生表(t_student)包含信息:
            sno:(pk主键) 学生学号
            sname:学生名字
            classno:(fk主键) 班级编号,引用t_class表中的cno字段。
    
        以上两张表:t_student中的classno字段引用t_class表中的cno字段,所以t_student是字表,t_class是父表。
    
    操作字表与父表的顺序要求:
        删除数据时,先删字表,再删父表;
        添加数据时,先添父表,再添字表;
        创建表时,先创父表,在创字表;
        删除表时,先删字表,再删父表。
    
    开始sql编写:
        drop table if exists t_student;
        drop table if exists t_class;
        create table t_class(
            cno int primary key,
            cname varchar(255)
        );
    
        create table t_student(
            sno int primary key,
            sname varchar(255),
            classno int,
            foreign key(classno) references t_class(cno)
        );
    
        insert into t_class values(101,'实验中学高一班');
        insert into t_class values(102,'实验中学高二班');
    
        insert into t_student values(10001,'马小虎',101);
        insert into t_student values(10002,'张小龙',101);
        insert into t_student values(10003,'刘红',102);
        insert into t_student values(10004,'李思思',102);
        insert into t_student values(10005,'jack',102);
    
        insert into t_student values(10006,'kitty',103);
        // ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`sqltest`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
    
    外键可以为NULL
        insert into t_student(sno,sname) values(10007,'外键可以为null');
    

    2,存储引擎

    查看当前mysql支持的存储引擎
        show engines \G
    
    2.1什么是存储引擎
    存储引擎这个名字只有在mysql中使用,(Oracle中有对应的机制,就是”表的存储方式“)
    

    上篇:③MySQL之DML(数据操作语言)、DDL(数据定义语言)
    下篇:⑤MySQL之约束二

    相关文章

      网友评论

          本文标题:④MySQL之约束一

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