MySQL为了让我们的表结构里面的数据完整性一致性非常强,mysql是给我们提供强约束的,在建表的时候就要把约束建立好
表的约束
真正的约束字段是数据类型,但是数据类型约束很单一,需要一些额外的约束,
mysql是和数据打交道的,mysql一定要尽量保证数据不要出现偏差,
空属性
- 两个属性:null和not null
c/c++ :null,0,‘\0’
mysql:NULL为不存在(空)!=0!=‘’\0’,就是我们没填
显示出来NULL就说明这个字段没填
这边的NULL显示的是yes,说明可以为null,就是我们可以不填
有的时候我们希望插入的时候字段都要有,不能为空,要么就别写,要么就都要写
添加约束not null
create table if not exists myclass(name varchar(12) not null,room varchar(24) not null);
这样保证了在表里面的数据都是有值的
默认值
如果我们没有填写的话,它就会填进去我们设置的默认值
create table friend (name varchar(16) not null,age int default 18,sex char(1) default '男');
默认值最大的意义是允许为空,但是一旦为空的时候,就填入一个缺省值,这样也就是不会出现空值
如果即用not null也有default,那么这个not null没有意义了,因为有default了,这个字段永远不为空
create table t11 (name varchar(12) not null default 'as');
列描述
comment 专门用来描述这个字段是什么意思的,给程序员来进行了解的,就是注释
create table if not exists t2 (name varchar(12) not null,age int not null comment '这是用户的年纪');
查看列描述
show create table t2\G;
zerofill
显示宽度
用0补位,int(5)zerofill,超过了正常位数,就正常显示,如果没有超过,前面就要用0来补位,满足5位,不影响数据的大小
我们再b那边再增加一个字段,zerofill这样它如果没有达到里面填写的位数的话,就会用0来补齐
如图,我们设置的5位,但是只填了3位,剩下的就用0来补齐
主键
所有的表都要有主键
数据库存入数据不是唯一目的,也要方便提取
一般而言,要求数据库表中的记录,有一个特定的唯一标识,来标定唯一性!
主键:priority key用来唯一约束该字段里面的数据,不能重复,不能为空,一张表里面最多只有一个主键,主键对应的字段为唯一值
- 创建表的时候,直接在字段上指定主键
create table t33 (id tinyint primary key comment '这是用户的主键',name varchar(12));
这里的额外的字段
重复的插入一个id=12,就会给我们报错
这样之后id一定不会重复,以后我们就可以用主键来快速找到一个人的信息
我们可以用主键来筛选出我们要的东西
主键的删除,只是删除主键约束,这个时候,就允许我们的id可以重复,因为我们只是把主键约束给删除掉,并没有删除其他的数据,
alter table t33 drop primary key;
添加主键,要我们明确是添加到哪一列上,
添加前有重复值,它就会报错,只能添加在那一列是唯一值的
- 复合主键
设置多个主键,
把主键的设置放在最后
create table t55 (id int(3) zerofill,course char(10) not null comment '课程',score decimal(4,2) default '60' comment '这个是默认的得分',primary key(id,course));
有一个值冲突,不算冲突,两个值都冲突才算冲突
自增长
auto_increment :当对应的字段,不给值,会自动被系统触发,系统自动会给你填入,会帮你最大值+1,通常必须搭配主键使用,必须使用整数,一张表只能有一个自增长,最开始我们没有设置就是从0开始增长,建议不要设置
create table t09 (id int primary key auto_increment comment'自增长',name varchar(12) default '');
我们发现,不给id设置,系统会自动对id进行给值,每次都是之前的+1,从最大值往后递增
我们设置自增的话,这个字段就不要我们自己设置
auto_increment 必须和主键进行搭配,否则就会报错
唯一键
主键只能有一个,唯一键可以有很多个
唯一键允许为空,主键不能为空,主键能标识唯一性,唯一键也能标识唯一键
create table tt (id int unique comment '唯一键',name char(20) not null);
null字段允许为空
这里我们重复向唯一键中插入值,它不允许我们插入相同的值
没有给id赋值,它允许为空,null,null代表的没有字段
在unique 前面加上not null,这个unique就变成了primary key,一旦变成非空,就变成了主键,所以不要取设置not null字段
主键和唯一键有什么区别??
主键和唯一键并不冲突,在一张表中,可以有一个主键,在其他列也可以同时有唯一键
表其实就是MySQL级别的,”类 or struct对象“的集合,表中保存的其实就是某些场景下的属性字段!
数据库本身是一个对数据约束很严格的技术
我们,身上不止有一个属性具有唯一性(学号):qq,手机号,b站账号,这些都是具有唯一性的,
我们身上需要具有很多要有唯一性的列
当然,也有很多不具有唯一性的列,:名字,身高,成绩
主键不是设置了主键属性,你才成为了主键,而是对应的属性被选择成为了主键(从众多具有唯一性的属性中,选择了一个,它成为了主键,而没有被选择,依旧需要唯一性的列,就被成员了唯一键)
主键和唯一键(互相补充,设计一个约束更强的表,不要插入不合理的数据)
create table t43 (id int primary key comment 'user school id',name varchar(12) not null comment 'user name',qq varchar(11) unique comment'user qq_id',telephone varchar(11) unique);
一般不要拿自己身上的属性做主键,因为万一某个变了,就失效了,用一个自增,与业务无关的东西,不影响表的整体结构
外键
外键主要是为了关联两张表,一张表的数据和另一张表的数据进行关联起来
外键是定义主表和从表之间的关系,表和表之间存在的关系就是
学生和班级拆成哪张表,我们数据库最好把表拆分到不能拆
让两个不同的表产生关系
外键一般是另一张表的主键,把外键当作主键的表叫做主表,包含外键的表叫做从表
外键vs外键约束
外键约束,再从表中插入一个主表中没有的值,是不被允许的
再主表中删除一个主键对应的值,从表中的数据全部删除了,这个才能被删除
表中产生的逻辑关系叫做外键,外键约束时逻辑上正确
我们先创建一个主表
再创建一个从表
foreign key (哪一个字段) references table_name (主键的字段)
创建了一个外键约束
create table stu (id int primary key, name varchar(12) not null, class_id int, foreign key (class_id) references class(id) );
我们插入了class里面有的值,它就允许我们进行插入了
插入class 里面没有的值,就不允许我们进行插入了
表和表之间数据完整性
从主表中删除数据,不允许我们删除,因为从表里面还有id=10的数据
外键约束,可以保证强约束,只有添加了外键约束,mysql才能帮我们取维护表和表之间逻辑关系
删除一个数据,把外键对应的数据都删除之后,才能把删除没对应的数据
综合案例
table goods
> create table customer (
-> customer_id int primary key,
-> name varchar(13) not null,
-> address varchar(30) unique,
-> email char(16) unique,
-> sex enum('男','女'),
-> card_id char(11)
-> );
table customer
> create table customer (
-> customer_id int primary key,
-> name varchar(13) not null,
-> address varchar(30) unique,
-> email char(16) unique,
-> sex enum('男','女'),
-> card_id char(11)
-> );
table purchases
> create table purchases(
> order_id int(10) zerofill primary key,
> customer_id int unique,
> goods_id int unique,
> nums int default 0,
> foreign key(goods_id) references goods(goods_id),
> foreign key(customer_id) references customer(customer_id)
> );