文章目录
一、空属性

之前我们将表的机构,使用desc table_name查看表的结构的时候,我们并没有说明Null这一栏代表的什么意思,现在我们就来详细讲解一下。
试想一种场景,我们要统计一个班上的人员信息,我们就需要创建一个表,这个表需要保存学生的姓名,学号,地址等信息。 以实际需求来讲,我们在插入表的时候,这里的姓名和学号是一定不能为空的,所以为了约束程序员在对表插入信息的行为,就可以使用添加是否允许一个字段的数据可以被设置为NULL。
那么怎么才能约束这种空属性的行为呢?
我们只需要在创建表的时候对字段添加上 not null
就可以约束该字段不允许为NULL。

可以看到,对设置的not null的字段强行设置为null时,数据库是会给我们报错的!
所以可以通过设置null空属性来对我们表插入的一种约束!
二、默认值

直接教用法:

然后插入数据
可以看到,我们设置的字段如果带有default默认值,在插入时如果忽略这个字段,会默认根据我们的设置的default默认值来填充这个字段。
三、zerofill
刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。
mysql> show create table tt3\G
***************** 1. row *****************
Table: tt3
Create Table: CREATE TABLE tt3 (
a int
(10)
unsigned DEFAULT NULL,b int
(10)
unsigned DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
int(N)
中的(N)
如果没有携带zerofill就没有意义了,那么它的作用是什么呢?
- 一旦添加了zerofill,该数字类型就会变成unsigned,所以也就不能再设置为负数。
- 我们使用select查询表中的内容时,可以发现,如果你输入的数字少于N位,输出的时候就会用0来填补位数;如果你输入的位数大于N位,就不会有任何影响。
四、列描述
列描述--comment之前我们就已经接触过了。
comment更像是一种注释的行为,也算是一种约束。
五、主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键。 主键所在的列通常是整数类型。
例如下面我们要创建一个student表,要以学生的学号作为主键。
方法1
方法2
在插入的时候,作为主键的字段不允许插入重复的数据,否则会报错。
删除主键
当创建好了一个表,并且创建表的时候就设置好了主键,如果又想删除这个字段的主键性质,应该怎么办?

追加主键
当有一个表,这个表没有主键,现在想让一个字段追加主键性质,应该怎么办?
复合主键

上面不是说 一张表中最多只能有一个主键吗? 为什么这里有两个主键?
这里的主键其实也只是一个,只不过这个表的主键添加到了两列上。
复合主键所带来的就是 在插入数据的时候,只要被设为主键的字段不同时存在相同的数据,就不会报错。
这里就是只要id和phone_num不同时都重复,插入就不会有问题,只有一个重复是没有关系的。
根据主键快速索引

六、自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
我们再调用show create table student \G;
可以看到这里是有一个AUTO_INCREMENT=22来控制这种自增长的。
last_insert_id()
LAST_INSERT_ID() 是 MySQL 中的一个函数,它用于获取最近一次使用 AUTO_INCREMENT 字段的 INSERT 或 UPDATE 语句生成的 ID 值。这个函数非常有用,特别是在你插入数据到包含自增主键的表中,并希望立即获取这个新生成的主键值的时候。
七、唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键。 唯一键就可以解决表中有多个字段需要唯一性约束的问题。
那么唯一键跟主键有什么区别呢?
主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。(其实也就是哲学意义不同)

对一个字段设置唯一键属性,可以用unique也可以用unique key。
我们还可以看到,primary key是默认带有not null属性的,unique key是不默认带有not null属性的。

八、外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
这里我们举一个例子就是主表为class,它有班级编号和班级名称;从表为student,它有学生的所属班级和学生的个人信息。 这里我们就可以让student表的所属班级与class表的班级编号相关联。
class表(主表)
student表(从表)
当从表student在向class_id插入1,2,3时都是非常顺利地插入进去的,但是当插入4的时候就报错了,这是因为我们的主表class只有1,2,3三个class_id,没有4这个班级编号,所以当从表student在插入4时才会报错,这就说明了这两个表已经建立了约束关系。
那如果我的主表想删除一行怎么办?
可以看到,如果我们想要删除主表中class_id=1的一行数据,数据库是不让我删的,这是因为我们的从表student也已经有对应的外键class_id=1,如果想要主表删除class_id=1这一数据行,首先就要删除所有从表外键class_id=1的数据行。

这也说明 主表和从表因为外键是互相约束的。