一、什么是表约束
表约束是在创建表的时候,设计的一些表的约束条件,用来保证数据的合法性和数据的正确性。
二、为什么需要表约束
表约束是为了规范程序员正确使用表的,但表约束是预先设置的,设置之后就对所有插入和修改立即生效,比如非空约束设置好之后,如果添加和修改为null值就会报错。
三、约束类型
1.非空约束
语法: 字段 字段类型 not null;
非空约束的作用:
注意:
1.学习了约束之后,我们设计表时,就应该注意约束条件。(字段 字段类型 约束…)
2.一个表中的非空约束时没有数量限制的,可以有[0,n]个。
查看非空约束:
⾮空约束可以使⽤ desc table_name 命令来查看:
2.唯一约束
语法:字段 字段类型 unique;
唯一约束的作用:
注:一张表里可以有一个或多个唯一约束。
问题: 给某个字段只创建了唯一约束,没有指定非空约束。
1.这个字段能不能插入NULL值? 能
2.这个字段能不能插入空值(’’)? 能
3.能否重复插入null值、’’ ? 可以重复插入null,但是 ''不可以重复插入!
注意:
1.唯一约束字段可以插入NULL;
2.唯一约束字段的NULL可以插入多个。(Mysql中的NULL比较特殊,这里的NULL不是一个值为’null’的字符串,而表示暂时是没有值的。)
3.NULL和字符串’NULL’的区别:
字段没有值: null
字段有值,值就等于字符’null’
这两者的是不相同的!
4.Mysql中需注意:null和空(’’)和’null’这三个是完全不相同的,不要混淆。
查询null: is null/is not null
查询 ‘’ ‘null’ := ‘’/‘null’ !=’’/‘null’
查看唯一约束
使用show keys from table_name;(行的形式)可以产看索引详情,或者使用show keys from table_name;(列的形式)查看。
3.主键约束
1.主键是可以用来表示一张表中某条数据的代表凭证,例如对于‘人’这张表来说,唯一的身份证号就可以作为主键来代表这个人,而‘姓名’就不行,因为姓名可能会有重复的。
2.语法:( primary key本质上=not null+unique)
3.主键的特征
①主键可以由多个字段或单个字段组成。
②主键不能为空且唯一。
③一个表中只能有一个主键。
4.单字段主键
‘’ ‘null’不能插入是因为主键的字段类型为int类型。varchar类型的主键是可以插入’'和 'null’的。
5.联合主键
总结:
1.联合主键:多个字段联合起来形成的主键,因此只要多个字段不同时重复,那么插入数据就可以成功。
2.独立主键:只有一个字段作为主键,因此此主键不能重复出现。
3.一个表只能有一个主键,一个主键中可以包含多个字段。
常见面试题:主键约束VS唯一约束
主键约束⼀个表只能有⼀个,⽽唯⼀约束可以有多个;
主键约束不能有 null 值,⽽唯⼀约束可以有 null(唯⼀索引可以有多个 null)。
4.外键约束
外键⽤于关联其他表的主键或唯⼀键,语法:
主表(主键)和次表(外键,关联到主表的主键上)
外键的作用:进行数据插入时,会先去主表查询外键的有效性。
注意:外键是可以插入null值的,并且可以插入多个null,但是如果指定了数据(指定了具体的值),那么这个值一定得是有效的才行(所谓有效指的是这个值已经在主表中存在了)。
5.检查约束
检查约束是保证列中的值符合指定的条件,⽐如性别只能插⼊“男”或者“⼥”。
语法:
查看当前使用的mysql服务器版本命令为: select version();
6.自增约束
语法:(自增约束通常和主键约束搭配在一起使用)
插入记录时,没有给自增列指定明确的值,自增列会自动生成下一个序列编号。⾃增默认从 1 开始,每次递增 1。
查看自增值:
使用show create table 表名;命令。可以看到当前的自增值(当前的自增最大值)已经变为3。即当我再输入一个name值时,id默认就等于3
注意:
1.当给自增列插入null时,它的执行逻辑和不设置是一样的,也就是自增列会自动生成下一个序列编号。
2.自增列可以指定值。
3.给自增列确定的值,会直接插入给定的值。且当下一次输入数据没有给定自增列值时,自增列会按照当前的自增最大值生成序列编号。(这样可以避免自增列的值发生冲突)
4.一个表只能有一个字段使用auto_increment约束,且该字段必须有唯一约束,以避免序号重复(即该字段为主键或主键的一部分)
5.⾃增列的字段类型只能为整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
6.auto_increment 必须配合 key ⼀起使⽤,这个 key 可以是 primary key,foreign key,unique,如果没有 key就会报错。
7.auto_increment不能只和not null一块使用。
手动指定自增值:
(字段…)auto_increment=n;
手动修改自增值:
alter table table_name auto_increment=n;
注意事项:auto_increment 的值只能设置⽐⽬前存储的最⼤值⼤,否则设置不会⽣效.
7.默认约束
默认约束是给没有给列赋值时的默认值,语法:
字段 字段类型 [其他约束…] default …;
id:自增列
name:默认值为空’’
createtime:默认为now(),即当前数据插入的时间
扩充:now() 类似auto_increment的用法
可以手动设置值