MySQL——约束条件、外键

文章目录

      • 创建表的完整语法
      • 约束条件
        • not null
        • unsigned
        • zerofill
        • default
        • unique
        • primary key
        • auto_increment
      • 清空数据的两种方式
      • 外键
        • 外键浅析
        • 外键种类
        • 如何判断表关系
        • SQL语句实现
        • 级联更新级联删除

创建表的完整语法

# 语法:
create table 表名 (
    字段名1 数据类型 约束条件1 约束条件2 约束条件3,
    字段名2 数据类型 约束条件1 约束条件2 约束条件3,
    字段名3 数据类型 约束条件1 约束条件2
                );

注意事项:

  • 字段名和数据类型是必填项
  • 约束条件可以选填
  • 在最后一个字段的后面不能加逗号,若加上则会报错

约束条件

​ 为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,数据库管理系统自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据准确有效。

约束条件 解释
NOT NULL 非空约束,指定某列不能为空;
UNIQUE 唯一约束,指定某列或者几列组合不能重复
PRIMARY KEY 主键,指定该列的值可以唯一地标识该列记录
FOREIGN KEY 外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性

not null

​ 非空约束,指定某列不能为空。

create table t1 (id int, name varchar(16) not null);
# 说明在录入数据的时候name字段不能为空

unsigned

​ 常用在数字类型的字段,对其表示范围做出限定,只包含正数,没有负号。

create table t1 (id int(8) unsigned);
# unsigned 表示int表示的范围为大于等于0的,而不包含负数

zerofill

​ 当输入的内容长度不能达到指定长度时,用0填充。

create table t2 (id int zerofill);
insert into t2 values (1);
insert into t2 values (111111);


create table t3 (id int);
insert into t3 values (1);
insert into t3 values (111111);

default

​ 可以为指定字段设置默认值,在录入数据的时候,可以不输入该字段内容,为以默认值填充。

create table t4 (id int, 
                 gender enum('male','female') default 'male'
                );
# 设置gender的默认值为male

unique

​ 唯一约束,表示指定某列或者几列组合不能重复。

create table t5 (id int, ip varchar(16));
# 单列唯一:ip字段唯一,不能重复
create table t6 (id int, ip varchar(16) unique);

# 多列唯一:ip+port组合不能重复
create table t7 (id int, 
                 ip varchar(16),
                 port int,
                 unique(ip, port)
                );

primary key

​ 主键,指定该列的值可以唯一地标识该列记录,在数据控制上面,主键就相当于非空且唯一,相当于not null + unique。

# id int primary key  ===  id int not null unique
# 主动指定主键字段
create table t8 (id int primary key,
                 name varchar(16)
                );

补充:InnoDB存储引擎要求每一张表必须有一个主键,但是我们在使用的InnoDB存储引擎也没有指定主键,但是表也创建成功了,为什么?

答:是因为InnoDB引擎有一个默认的主键,而这个默认的主键只是帮助我们把表创建成功,并且是隐藏的主键,不能够使用用。主键最主要的一个作用是可以帮助我们提高查询速度。

auto_increment

​ 约束字段为自动增长,被约束的字段必须同时被key约束,搭配primary key使用。

create table t9 (
    id int primary key auto_increment,
    name varchar(16)
);

清空数据的两种方式

  • delete from 表名
delete from t1;
  • truncate 表名
truncate t1;

补充:两种方式的区别:

delete from 表名方式,不会影响主键,当下次添加数据的时候还是在之前的上面递增,而truncate 表名方式则会影响主键,再次添加数据的时候主键字段会重新开始。

外键

外键浅析

​ 外键的目的是建立两张表之间关系的中间桥梁。

​ 假如我们要描述所有公司的员工,需要描述的属性有这些 : 工号、姓名、部门,公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,浪费的存储空间就越多。

​ 解决方法: 我们可以定义一个部门表,然后让员工信息表关联该表,如何关联,即使用foreign key,也就是外键。

外键种类

  • 一对多
  • 多对多
  • 一对一

如何判断表关系

分析步骤:

  1. 先站在左表的角度去找:是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)
  2. 再站在右表的角度去找:是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
  • 判断是否为一对多?

    如果只有步骤1成立,则是左表多对一右表
    如果只有步骤2成立,则是右表多对一左表
    
    这种情况外键字段一般设置在多的一方
    
  • 判断是否为多对多?

    如果步骤12同时成立,则证明这两张表时一个双向的多对一,即多对多
    
    此情况则需要定义一个这两张表的关系表来专门存放二者的关系,也就是第三章表。
    
  • 判断是否为一对一?

    如果12都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。
    
    这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
    针对一对一关系,外键字段健在任何一方都可以,推荐在使用频率比较高的一张表上
    

SQL语句实现

"""
规则:
	1.在创建表关系的时候,先创建基础字段
    2.再创建外键关系
	3.先创建没有外键的一张表
	4.录入数据的时候先录入没有外键的一张表
"""

####################################一对多##########################################
1. 一对多的关系
create table book (
    id int primary key auto_increment, 
    title varchar(64),
    price decimal(8, 2),
    publish_id int,
    Foreign key(publish_id) references publish(id)
);

create table publish (
	 id int primary key auto_increment, 
     name varchar(32)
)


####################################多对多##########################################
create table book (
    id int primary key auto_increment, 
    title varchar(64),
    price decimal(8, 2)
);

create table author (
	 id int primary key auto_increment, 
     name varchar(32)
);

create table book2author (
	 id int primary key auto_increment, 
     book_id int,
     Foreign key(book_id) references author(id) 
     on update cascade
     on delete cascade,
     author_id int,
     Foreign key(author_id) references book(id) 
     on update cascade 
     on delete cascade
);

###############################一对一######################################
create table author2 (
    id int primary key auto_increment, 
    name varchar(64),
    author_detail_id int unique,
    Foreign key(author_detail_id) references author_detail(id)
);

create table author_detail (
	 id int primary key auto_increment, 
     name varchar(32)
)

级联更新级联删除

​ 当我们将两张表之间建立关联的时候,如果修改了其中一张表的内容,那么另外一张表的关联字段应该不应该随之改变呢?答案是肯定的。因此我们就出现了级联删除、级联更新来解决这样的问题。

  • on update cascade:级联更新
  • on delete cascade:级联删除

示例:

create table book (
    id int primary key auto_increment, 
    title varchar(64),
    price decimal(8, 2),
    publish_id int,
    Foreign key(publish_id) references publish(id)
    on update cascade 
    on delete cascade
);

create table publish (
	 id int primary key auto_increment, 
     name varchar(32)
)

你可能感兴趣的:(MySQL,sql,mysql)