06_MySQL数据库_表的约束

此专栏所有章节快速导航

01_MySQL数据库_CentOS7安装MySQL
02_MySQL数据库_数据库基础知识
03_MySQL数据库_库的操作
04_MySQL数据库_表的操作
05_MySQL数据库_数据类型
06_MySQL数据库_表的约束
07_MySQL数据库_增删查改
08_MySQL数据库_复合查询
09_MySQL数据库_索引
10_MySQL数据库_事务管理
11_MySQL数据库_用户管理
12_MySQL数据库_CentOS7下C-C++链接MySQL

一. 前言

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。

二. 表的约束

2.1 空属性

字段默认情况下是可以为null(空)的,但是像学生的学号和姓名是不能为空的,所以我们要在后面加一个not null。如下图显示,Null的那一列显示的是NO,这样如果插入的时候不赋值会直接报错

# 案例
create table student 
(
    id char(8) not null, 
 	name varchar(32) not null
);

在这里插入图片描述

2.2 默认值

某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。not nulldefalut一般不需要同时出现,因为default本身有默认值,不会为空。

create table stu 
(
    name varchar(32) not null,
    age tinyint unsigned default 18  # 插入数据时,如果没有age字段赋值,就使用默认值18
);

在这里插入图片描述

2.3 列描述

comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

create table stu 
(
    name varchar(32) not null comment '姓名',
    age tinyint unsigned default 18 comment '年龄'
);

在这里插入图片描述

2.4 zerofill

zerofifill属性的作用,如果宽度小于设定的宽度,自动填充0,补多少个零由int(x)的x决定。 要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是实际的数字。

create table t1 
(
    a int, 
    b int(5) zerofill  # 这里的5的意思是,如果保存的数字不够长度,在显示的时候自动会补0,补到5个数字
);

在这里插入图片描述

2.5 主键

2.5.1 单主键

primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键,主键所在的列通常是整数类型。如下图所示主键是不能为空的,插入的时候也不能跟已有的主键数据重复,否则会报错。

# 创建表时就定义好主键
create table stu 
(
    id int unsigned primary key,   # id为主键
    name varchar(32) not null
);

# 删除主键(注意删除主键后,原主键字段还会保留不能为空的属性)
# alter table 表名 drop primary key;
alter table stu drop primary key;  # 从stu表中删去主键

# 追加主键(追加的字段需要保证该字段不能没有空的数据,也没有重复的数据)
# alter table 表名 add primary key(字段列表)
alter table stu add primary key(id);  # 设置id字段为stu表的主键

在这里插入图片描述

2.5.2 复合主键

复合主键就是由多个字段组合成一个主键,被设置成复合主键的字段都不能为空,组成复合主键的个别字段可以重复,但是不能让所有的字段都重复。

create table t1 
(
    a int unsigned ,
    b int unsigned, 
    primary key(a, b)  # 设置a和b两个字段为复合主键
);

在这里插入图片描述

2.6 唯一键

2.6.1 简述

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,唯一键就可以解决表中有多个字段需要唯一性约束的问题。

2.6.2 唯一键和主键

唯一键的本质和主键差不多,不能够重复,但是唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

create table t1 
(
    a int unsigned primary key,  # 主键
    b int unsigned unique        # 唯一键
);

在这里插入图片描述

2.7 自增长

2.7.1 简述

自增长auto_increment,当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

create table stu 
(
    a int unsigned primary key auto_increment,  # 设置成auto_increment的主键插入数据时可以不给值,系统会自动赋值
    name varchar(32)
);

2.7.2 自增长特点

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值,比如设置成主键唯一键等等)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

2.8 外键

2.8.1 简述

外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null,否则插入数据的时候会报错。

# 主表
create table class 
(
    id int primary key, 
    name varchar(32) not null
);

# 从表
create table stu 
(
    id int primary key, 
    name varchar(32) not null, 
    class_id int, 
    foreign key(class_id) references class(id)  # 声明外键
);

2.8.2 外键的使用场景

比如一个学校的一年级有三个班,id分别为001,002,003。学校需要设计一张表录入一年级学生的信息,其中一个字段为班级id的。这个时候如果没有约束的话,在学生表录入信息时可能会被录入004,005这样的班级,这是不对的。所以我们需要在学生表里面将班级表的id设置为外键,这样在录入班级id的时候就只能录入001,002,003这三个数据了。

三. 综合案例

3.1 数据

  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商provider)
  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

3.2 要求

  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)

3.3 实现

# 商品
create table if not exists goods 
(
    goods_id int(5) unsigned zerofill primary key auto_increment,
    goods_name varchar(32) not null,
    unitprice float(5,3) unsigned not null,
    category varchar(32) not null,
    provider varchar(32) not null
);

# 客户
create table if not exists customer
(
    customer_id int(5) unsigned zerofill primary key auto_increment,
    name varchar(32) not null,
    address varchar(32) not null,
    email varchar(32) unique,
    sex enum('男', '女') not null,
    card_id char(18) unique
);

# 订单
create table purchase
(
    order_id int(5) unsigned zerofill primary key auto_increment,
    customer_id int(5) unsigned,
    goods_id int(5) unsigned,
    nums smallint unsigned not null,
    foreign key (customer_id) references customer(customer_id),
    foreign key (goods_id) references goods(goods_id)
);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柿子__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值