1.约束类型
1.not null:指示某列不能存储null值
2.unique:保证某列的每行必须有唯一值
3.default:规定没有给列赋值时的默认值
4.primary key:not null和unique的结合。确保某列(或两个或多个列的结合)有唯一标识,有助于更容易更快捷的找到表中的一个特定记录。
5.foreign key:保证一个表中的数据匹配另一个表中的值的参照完整性。
6.check:保证列中的值符合指定的条件。对于MYSQL数据库,对check子句进行分析,但是忽略check子句
1.1 not null约束
not null:指示某列不能存储null值
创建表时,指定字段添加约束
NO表示不能写入null
YES表示可以写入null
1.当字段指定约束not null时,写入数据时,未写该字段,会报错,报Field '字段' doesn't have a default value,该字段没有默认值,你必须写上一个值
2.not null约束的字段,在写入数据时,不能对该字段写入null,数据库帮我们做了一次校验
3.只有当非空列有值时可以写入
1.2 unique (唯一约束)
指定某列为唯一的,不重复的:
create table test(-> id int unique,-> name varchar(20)-> );
约束id字段为唯一的,不重复的
当test表中有了一条id为1,name为张三的数据,再插入一条id为1,name为李四的数据时,会报id重复的警告
当指定字段被unique约束时,插入的数据可以为null,当再次插入null的数据时,不会报错null可以重复插入
1.3default (默认约束)
规定没有给列赋值时的默认值
指定插入数据时,name为空,默认为无名氏
create table test(-> id int,-> name varchar(10) default'无名氏'-> );
当为某列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束
虽然指定了默认约束,但是当我们手动指定这一列的值为null时,插入的值依然为null,因为这个null是我们手动指定的,可以理解为我们想要的值
用户指定的优先级要高于默认约束
1.4primary key(主键约束)
指定id列为主键
create table test(-> id int primary key,-> name varchar(20)-> );
primary key是not null与unique的结合,确保某列(或两列或多个列的结合)有唯一标识,有助于更容易更快速的找到表中的一个特定记录
主键约束的列即使非空的,也是唯一的
列被标识为PRI,表示他是一个主键
1.写入数据时,两个约束同时生效
2.主键约束帮我们校验了非空和唯一,这两个校验在写入数据时对效率有一定影响,比起不做校验,这个性能消耗是可以承担的
3.建议为每一张表定义一个主键
auto_increment
对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。
create table test(-> id int primary key auto_increment,-> name varchar(20)-> );
让数据库帮我们去维护主键的增长,不用程序员自己去计算了,在插入的时候先找到最大的值,然后在这个基础上加1,生成一个新的值,作为新一个数据行主键id列的值
全列插入
设置了自增主键之后,发现写入null时,也可以成功的插入数据
这里并不是说把null写入数据库了,而是说让数据库帮我们处理这个列的值(自增操作)
指定列插入
当删除前两条数据后,再插入数据,id列会在删除的最后一条数据上加一作为新的数据的id值,以上现象是有delete造成的
delete:delete即使删除全部数据,他并不会改变表的结构,可以回滚,所以你主键记录到的值是从之前的开始往下记录的
主键值可以自己添加,只要和之前的不同就行,所以主键值在数据1表有可能是不连续的
当再次添加数据时
对于我们插入的数据,数据库会自动帮我们进行排序(在自增操作下)
一个表中不允许有两个主键
但是一个主键可以包含多个列(复合主键)
在唯一校验时,只有复合主键中所有的列都相同才会被判定为相同
主键的值时定义主键时,多个列值的组合
1.5 foreign key
保证一个表中的数据匹配另一个表中的值的参照完整性
表中某个列的值,必须是另一张表中的主键列,或是唯一约束列的值,也就是当前表中的值必须在另一张表中存在,且满足主键或唯一约束
创建班级表和学生表
CREATE TABLE class(
id int PRIMARY KEY auto_increment,
name varchar(20)
);CREATE TABLE student(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) not NULL,
class_id int
);
当前表没有设置主外键关系
外键用于关联其他表的主键或唯一键
语法:
foreign key (字段名)references 主表(列)
create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> class_id int,-> foreign key(class_id)references class(id)-> );
1.foreign key:创建外键的关键字
2.class_id:表示当前表中class_id这个字段要与主表建立主外键关系
3.references:关键字,表示后面要引用哪个表中的哪个列
4.class(id):指定主表和相应的列
通过外键约束,保证数据的完整性和关系的正确性
删除主表的数据
1.删除主表数据,会报一个主外键关系的错误
2.如果要删除主表中的记录,子表中不能有对该条记录的依赖,也就意味着要先删除子表中的记录,再去删除主表中的记录
1.5 check
保证列中的值符合指定的条件。对于MYSQL数据库,对check子句进行分析,但是忽略check子句
1.check关键字是用来检查这个值是否符合check后面的条件的
2.但是mysql8.0.16之前的版本不支持这个约束,所以写了也没什么效果
3.只有从8.0.16开始,check约束才被正式支持可以使用生效