表约束
一、概念
表中一定要有各种约束,通过各种约束使得未来插入到数据库中的数据是合法的,在语法上是没有问题的;
约束本质就是通过技术手段,倒逼着程序员插入正确的数据,换句话说就是,插入进来的数据一定是符合数据约束的;最终保证数据的完整性和可预期性;
二、非空约束
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)
);