MySQL——表的约束

表约束

一、概念

​ 表中一定要有各种约束,通过各种约束使得未来插入到数据库中的数据是合法的,在语法上是没有问题的;

​ 约束本质就是通过技术手段,倒逼着程序员插入正确的数据,换句话说就是,插入进来的数据一定是符合数据约束的;最终保证数据的完整性和可预期性;

二、非空约束

select null;#NULL表示没有,不区分大小写;

在这里插入图片描述

select 1+null;#实际上null是不会参与计算的

在这里插入图片描述

​ 空属性有两个值,分别是null(默认值)和not null;创建表时除了写表属性和类型之外还可以添加null和not null分别表示允许为空和不允许为空;

在这里插入图片描述

​ Null列表示是否启用空属性约束;默认约束是Null,由于不启用空约束所以就不允许插入缺省值了;

三、默认约束

​ 常用的某一个具体值,可以一开始就指定好,用户需要显式传递时允许用户传入其需求值;

​ default和not NULL并不冲突,当用户显示插入对应属性时,可以插入NULL或者合法数据,当不插入数据时,如果设置了default就会自动插入缺省值,没设置就必须用户显示插入;

​ MySQL默认的default值是NULL;

四、comment约束

​ 相当于属性字段的注释,用于程序员和DBA进行了解;

create table 表名(属性名 属性类型 非空约束 默认约束 comment '属性注释');

五、zerofill约束

create table 表名(属性名 属性类型 非空约束 默认约束 comment '属性注释'zerofill);
#zerofill表示是否启用;

​ 关于显示方面的约束;如果显示的宽度小于指定的宽度,使用zerofill填充之后就会使用0填充指定的宽度;如果数据的宽度大于zerofill约束指定宽度,还是可以正常显示,所以zerofill是一种至少的行为;

​ int是4个字节,无符号显示出来就是十个位,有符号还有符号位所以是十一位;

六、主键约束

​ 主键:primary key用来唯一约束该字段里面的数据,不能重复,不能为空,一张表里面只能有一个主键;

create table 表名(属性名 属性类型 非空约束 默认约束 zerofill primary key comment '属性注释');
create table 表名(属性名 属性类型 非空约束 默认约束 zerofill comment '属性注释',primary key('属性名'));

​ 存在的意义就是:使得属性唯一标识,不可以被修改,便于增删查改;

alter table 表名 add primary key(属性字段);
alter table 表名 drop primary key;

​ 主键也可以添加到多列,即复合主键,仍然是一个主键;

​ 严格的按照一对一的关系,不允许同一个记录重复出现;

6.1自增长约束

​ auto_increment是主键的一种,插入数据时可以不用考虑它,每次在插入数据时都会自动地进行最大数据加一;**自增长约束一般都必须设置成主键;自增长字段必须是整数;一张表只能有一个自增长;**常用于索引;

create table if not exists t2(
    id int unsigned primary key auto_increment,
    name varchar(20) not null
)auto_increment=5;
    Create Table: CREATE TABLE `t2` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `name` varchar(20) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
#除了表内属性进行了优化,表外属性也自动添加AUTO_INCREMENT=5,表明下一次插入时会使用的主键值;每次插入玩=完成之后会更新AUTO_INCREMENT字段;

​ 补充:索引的本质就是以空间换时间,为kv映射关系提供了专门的空间,便于快速定位;索引和主键相关

七、唯一键约束

create table t3(
    id char(20) unique comment '这是一个学生的唯一键学号',
    name varchar(32) not null
);

Create Table: CREATE TABLE `t3` (
  `id` char(20) DEFAULT NULL COMMENT '这是一个学生的唯一键学号',
  `name` varchar(32) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | char(20)    | YES  | UNI | NULL    |       |
| name  | varchar(32) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

​ 唯一键与逐渐最大的不同就是可以为空,并且空可以重复;

​ 他们之间互为补充,其中选择了主键作为索引,但是其他的属性逻辑上也要保证唯一性,所以需要有唯一键来保证唯一性;

八、外键约束

​ 外键常用于主表和从表之间建立联系;即从表中有属性与主表的主键或者唯一键属性相关联,此时就需要使用外键建立联系;

create table if not exists student(
    id int primary key,
    name varchar(20) not null,
    telephone varchar(20) unique key,
    class_id int,
    foreign key(class_id) references class(id)
);

Create Table: CREATE TABLE `student` (
    `id` int(11) NOT NULL,
    `name` varchar(20) NOT NULL,
    `telephone` varchar(20) DEFAULT NULL,
    `class_id` int(10) unsigned DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `telephone` (`telephone`),
    KEY `class_id` (`class_id`),
    CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int(11)          | NO   | PRI | NULL    |       |
| name      | varchar(20)      | NO   |     | NULL    |       |
| telephone | varchar(20)      | YES  | UNI | NULL    |       |
| class_id  | int(10) unsigned | YES  | MUL | NULL    |       |
+-----------+------------------+------+-----+---------+-------+

​ 外键既可以保证从表插入时,需要符合约束条件,也可以保证从表外键约束有数据时不可以删除主表内容;

​ 定义外键时必须保证外键列数据在主表中存在或者为空;

九、综合案例

​ 约束会保证凡是进入mysql中的数据一定是符合规定的;

一个商店的数据记录客户端及客户购物情况,由三个表组成;

​ 商品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);

要求:

​ 每个表的主外键;

​ 客户的姓名不能为空值;

​ 邮箱不能重复;

​ 客户的性别(男,女);

-- 创建数据库
create database if not exists bit32mall
default character set utf8 ;
-- 选择数据库
use bit32mall;
-- 创建数据库表
-- 商品
create table if not exists goods
(
    goods_id int primary key auto_increment comment '商品编号',
    goods_name varchar(32) not null comment '商品名称',
    unitprice int not null default 0 comment '单价,单位分',
    category varchar(12) comment '商品分类',
    provider varchar(64) not null comment '供应商名称'
);
-- 客户
create table if not exists customer
(
    customer_id int primary key auto_increment comment '客户编号',
    name varchar(32) not null comment '客户姓名',
    address varchar(256) comment '客户地址',
    email varchar(64) unique key comment '电子邮箱',
    sex enum('男','女') not null comment '性别',
    card_id char(18) unique key comment '身份证'
);
-- 购买
create table if not exists purchase
(
    order_id int primary key auto_increment comment '订单号',
    customer_id int comment '客户编号',
    goods_id int comment '商品编号',
    nums int default 0 comment '购买数量',
    foreign key (customer_id) references customer(customer_id),
    foreign key (goods_id) references goods(goods_id)
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值