Mysql学习笔记第五章—约束

约束

1.约束概述

  • 在创建表时,给表的字段添加相应约束,保证数据的合法性、有效性、完整性。

  • 常见的约束:

    非空约束:not null,约束的字段不能为NULL

    唯一约束:unique,约束的字段不能重复但可以为NULL。

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

    外键约束:foreign key(简称FK),

2.非空约束not null

  • 非空约束:not null,约束的字段不能为NULL

    mysql> drop table if exists t_user;
    mysql> create table t_user(
        -> id int,
        -> username varchar(255) not null,
        -> password varchar(255)
        -> );
    mysql> insert into t_user(id,password) values (1,'123');
    ERROR 1364 (HY000): Field 'username' does not have a default value
    
    mysql> insert into t_user(id,username,password) values (1,'ice','coffee');
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from t_user;
    +------+----------+----------+
    | id   | username | password |
    +------+----------+----------+
    |    1 | ice      | coffee   |
    +------+----------+----------+
    

3.唯一约束unique

  • 唯一约束:unique,约束的字段不能重复,但可以为NULL。
mysql> drop table if exists t_user;
mysql> create table t_user(
    -> id int,
    -> username varchar(255) unique #添加唯一约束
    -> );
mysql> insert into t_user values(1,'coffee');
Query OK, 1 row affected (0.01 sec)
#不能重复
mysql>  insert into t_user values(2,'coffee');
ERROR 1062 (23000): Duplicate entry 'coffee' for key 't_user.username'
#可以为空
mysql> insert into t_user (id)  values(3);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
|    1 | coffee   |
|    3 | NULL     |
+------+----------+
  • 给多个列添加unique
#两个字段联合起来不重复
mysql> create table t_user(
    -> id int,
    -> username varchar(255),
    -> usercode varchar(255),
    -> unique(username,usercode) 
    -> );
#这样不会报错
mysql>insert into t_user values(1,'111','coffee');
mysql>insert into t_user values(2,'111','ice');
mysql>insert into t_user values(3,'222','coffee');

#如果是分别写unique。两个字段各自的字段不重复
mysql> create table t_user(
    -> id int,
    -> username varchar(255) unique,
    -> usercode varchar(255) unique
    -> );
mysql>insert into t_user values(1,'111','coffee');
#开始报错
mysql> insert into t_user values(2,'111','ice');
ERROR 1062 (23000): Duplicate entry '111' for key 't_user.username'
mysql> insert into t_user values(3,'222','coffee');
ERROR 1062 (23000): Duplicate entry 'coffee' for key 't_user.usercode'

4.主键约束primary key

  • 主键约束:primary key(简称PK),约束的字段既不能为NULL,也不能重复
mysql> create table t_user(
    -> id int primary key, #添加组件约束
    -> username varchar(255),
    -> email varchar(255)
    -> );
#测试
mysql> insert into t_user(id,username,email) values (1,'zs','[email protected]'),(2,'lis','[email protected]'),(3,'ww','[email protected]');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql>  insert into t_user(id,username,email) values (1,'ice','[email protected]');
ERROR 1062 (23000): Duplicate entry '1' for key 't_user.PRIMARY'
mysql> insert into t_user(username,email) values ('ice','[email protected]');com');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
  • 表设计的三范式:第一范式要求任意一张表中都应该有主键。

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

    注:一张表的主键约束只能有一个。

  • 根据自然性质划分:

    自然主键:这是一个和业务没有任何关系的自然数。

    业务主键:和系统业务挂钩,例如银行卡号做主键、身份证号做主键。

  • mysql提供主键值自增:auto_increment

mysql> drop table if exists t_user;
mysql> create table t_user(
    -> id int primary key auto_increment,#表示id字段自动维护一个自增的数字,从1开始以1递增。
    -> username varchar(255)
    -> );
mysql> insert into t_user(username) values('a');
mysql> insert into t_user(username) values('b');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
|  2 | b        |

5.外键约束foreign key

  • 外键约束foreign key:

【例子】

  • 有一张班级表t_class
cno(pk) cname
101 高一1班
102 高三2班
103 高三3班
  • 有一张学生表t_student
sno(pk) sname classno(该字段添加外键约束fk)
1 coffee1 101
2 coffee2 101
3 coffee3 102
4 coffee4 102
5 coffee5 102
  • 以上中:t_student中的classno字段引用t_class表中cno字段,此时t_student表叫做子表,t_class表叫做父表。

    在创建时或插入数据时,应先创建父表再创建子表。

    删除表或删除数据时,先删子表再删除父表。

  • 语法格式:foreign key(本表字段) references 父表(父表字段)

    注意:父表字不一定是主键,但至少具有unique约束。

#先删子表
mysql> drop table if exists t_student;
#再删父表
mysql> drop table if exists t_class;
#先创建父表
mysql> create table t_class(
    -> cno int,
    -> cname varchar(255),
    -> primary key(cno)
    -> );
#创建子表
mysql> create table t_student(
    -> sno int,
    -> sname varchar(255),
    -> classno int,
    -> primary key(sno),
    -> foreign key(classno) references t_class(cno)
    -> );
#先插入父表数据
mysql> insert into t_class values('101','高一1班'),('102','高一2班'),('103','高一3班');
mysql> select * from t_class;
+-----+------------+
| cno | cname      |
+-----+------------+
| 101 | 高一1班    |
| 102 | 高一2班    |
| 103 | 高一3班    |
+-----+------------+
#再插入子表数据
mysql> insert into t_student values(1,'coffee1','101'),(2,'coffee2','101'),(3,'coffee3','102'),(4,'coffee4','102'),(5,'coffee5','102');
mysql> select * from t_student;
+------+---------+---------+
| sno  | sname   | classno |
+------+---------+---------+
|    1 | coffee1 |     101 |
|    2 | coffee2 |     101 |
|    3 | coffee3 |     102 |
|    4 | coffee4 |     102 |
|    5 | coffee5 |     102 |
+------+---------+---------+
#插入父表没有的classno,不能添加子记录。
mysql> insert into t_student value(6,'coffee6','104');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`studytest`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
#外键可以为null
mysql> insert into t_student value(7,'coffee7',null);
mysql> select * from t_student;
+------+---------+---------+
| sno  | sname   | classno |
+------+---------+---------+
|    1 | coffee1 |     101 |
|    2 | coffee2 |     101 |
|    3 | coffee3 |     102 |
|    4 | coffee4 |     102 |
|    5 | coffee5 |     102 |
|    7 | coffee7 |    NULL |
+------+---------+---------+

学习视频:动力节点MySQL基础入门到精通

你可能感兴趣的:(咖啡ice的MySQL学习记录,mysql,学习,笔记)