💓个人主页:mooridy
💓专栏地址:MySQL
关注我🌹,和我一起学习更多计算机的知识
🔝🔝🔝
约束 ,是对表中的数据进行限定,保证数据的正确性、有效性和完整性。
表的约束很多,本文将主要介绍如下几个:
null/not null
,default
, comment
, zerofill
,primary key
,auto_increment
,unique key
,foreign key
。
空属性
空属性包括:NULL
和 NOT NULL
默认为NULL
,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
可以看到插入数据时,没有给class_room
提供数据就会报错
默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
mysql> create table person(-> name varchar(10) not null,-> age int,-> gender char(2) default '男');
Query OK, 0 rows affected (0.02 sec)mysql> desc person;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+
| name | varchar(10) | NO | | NULL | || age | int(11) | YES | | NULL | || gender | char(2) | YES | | 男 | |+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)mysql> insert into person(name) values('tom');
Query OK, 1 row affected (0.01 sec)mysql> select * from person;
+------+------+--------+
| name | age | gender |+------+------+--------+
| tom | NULL | 男 |+------+------+--------+
1 row in set (0.00 sec)
可以看到尽管我们没有对性别字段赋值,该字段仍然有值,且我们指定的默认值。
列描述comment
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存。
create table if not exists person2(name varchar(20) not null comment '姓名',age int comment '年龄'',gender char(2) not null comment '性别');
注意:列描述需使用单引号'
来括住,comment
与描述之间有空格。
查看comment
通过desc
语句是看不到注释信息的
只有通过show
语句才能看到,在语句末尾加上\G
可以格式化内容,使信息看起来更直观。
注意:
show create table [表名]/G;
不要漏了create
或者table
zerofill # 零填充
有时我们会看到诸如int(5)
的类型后面跟数字的型式,这显然不是指明有多少个字节,而是与zerofill
搭配使用,以表示数字位数,不足的位数用零补充。
ps:int(5)
单独使用没有意义,必须搭配zerofill
使用
- 我们将
person2
的age
添加zerofill
,并规定位数为5.
alter table person2 change age age int(5) zerofill;
插入后进行查询,发现age
列的数据占5位,原本的空位用0进行了填充。
主键 primary key
主键:primary key
用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个
主键所在列的类型通常为整数
创建表person3,并将主键设置到id列
mysql> create table if not exists person3(
id int unsigned primary key,
name varchar(20) not null);
下面我们对主键的性质进行验证:
-
非空性
-
不可重复
-
一张表最多只能有一个主键
-
删除主键
alter table 表名 drop primary key;
- 当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)
复合主键
在创建表的时候,在所有字段之后,可使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键
注意:一张表逐渐只能一个,但一个主键可以包含多个字段
create table courses1( course_id int comment '课程编号', course_name varchar(20) comment '课程名称', course_type varchar(10) comment '课程类型',primary key(course_id,course_name));
//course_id,course_name为复合主键
mysql> insert into courses1 values(1,'english','a');
Query OK, 1 row affected (0.00 sec)mysql> insert into courses1 values(1,'english','a');
ERROR 1062 (23000): Duplicate entry '1-english' for key 'PRIMARY'//只有两列的数据完全相同时才不行,一列相同仍然可以插入mysql> insert into courses1 values(2,'english','a');
Query OK, 1 row affected (0.00 sec)
自增长 auto_increment
auto_increment
:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );
mysql> insert into tt21(name) values('a');
mysql> insert into tt21(name) values('b');
mysql> select * from tt21;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+
唯一键 unique key
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,怎么办呢?
那么这时我们就可以使用唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,但唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
唯一键和主键的区别:
主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
举个例子:
外键 foreign key
外键用于定义主表和从表之间的关系:
外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
foreign key (字段名) references 主表(列)
eg. purchase为从表,customer ,goods为主表
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)
)
alter table 从表名 add constraint foreign key(从表上的字段) references 主表名(主表上的字段);
alter table 从表名 add constraint foreign key(从表上的字段) references 主表名(主表上的字段);
综合练习
mysql> create database mall;
Query OK, 1 row affected (0.00 sec)mysql> use mall;
Database changed
mysql> create table purchase(-> order_id int primary key,-> customer_id int unique key,-> goods_id int unique key,-> nums int not null);
Query OK, 0 rows affected (0.02 sec)mysql> create table goods(
goods_id int primary key auto_increment,
goods_namee varchar(20) not null,unitprice float(4,2) unsigned default 0,catagory varcchar(12), provider varchar(30) not null);
Query OK, 0 rows affected (0.02 sec)mysql> create table customer(-> customer_id int primary key auto_increment,-> name varchar(20) not null,-> address varchar(60));
Query OK, 0 rows affected (0.02 sec)mysql> alter table purchase add constraint foreign key(customer_id) references customer(customer_id);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> alter table purchase add constraint foreign key(goods_id) references gooods(goods_id);
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0