文章目录
Mysql表的约束
mysql为上面要有约束?
约束本质是MySQL通过限制用户操作的方式,来维护数据本身的权限的一套方案
本质上MySQL是一套数据存储解决方案,处理解决基本的数据存储功能之外,还要尽可能保证数据的安全性,减少数据误操作
mysql如何约束?
约束也是一套整体的约束方案
约束的体现,不仅仅可以体现在数据库层面,在我们进行用户业务逻辑编码的时候,我们其实也可以添加约束(判断),不满足就不让往数据库插入
数据库层面上,编码层面上也是可以提现的
空属性
null(默认的)和notnull(不为空)
数据库默认字段为空,但是实际开发中,尽可能保证字段不为空,因为数据为空不能参与运算
查看空字段
selectnull;
案例
//设置名称和班级不为空createtableifnot existts mycalss
(
class_name varchar(20)notnull,
class_room varchar(20)notnull);
此时我们要是有一个不进行设置则会报错,只有两个都不为空的时候才不会报错
默认值default
某种数据会经常性的出现某一个具体的值,可以在一开始就指定好,在开始时使用默认值
例:
createtable t1(age tinyintunsigneddefault0);//age一栏默认设置为0
![(img-2hTFcF04-1650333078958)]](https://img-blog.csdnimg.cn/22ca24a09d694895bc460e52ca8691c5.png)
上面当我们在次插入要是不指定age的值那么就会自动填充为0
not null和default可以同时存在,此时会自动添加default设定的默认值
建议not null和default只设置一个
有默认值就设置default
没有默认值只是不想让它为空就设置not null
列描述comment
comment,没有实际意义,用来描述字段,相当于注释
createtable t16(name varchar(20)notnullcomment'名字',
age tinyintunsigneddefault18comment'用户年龄');
zerofill
设定属性的宽度,如果宽度小于设定的宽度,自动填充0,需要注意的是,这只是显示的结果,只是一种格式化输出
createtableifnotexists t10(
a int(10)intunsigneddefault,
b int(10)intunsigneddefault);
altertable t10 change a int(10)unsigned zerofill;
![(img-PiY5kUtI-1650333078959)]](https://img-blog.csdnimg.cn/0ceb7fa1e6d74aab8edaa946bf4144b6.png)
主键primary key
主键:primary key用来唯一的约束该字段的数据,不能重复,不能为空,一张表中只能用一个主键
案例
createtable t18(id intunsignedprimarykeycomment'学生的学号,作为主键',name varchar(10)notnullcomment'学生姓名')engine=InnoDBdefaultcharset=utf8;
insertinto t18 values(1,'孙悟空');insertinto t18 values(1,'猪八戒');//这时候主键冲突,出错//要是设置了default,则第一次可以插入,后面就不行了
设置指定列是主键之后,默认不能为空,如果设置了default,默认插入的时候是可以出现空的,但是不推荐(只能使用一次)
主键的删除
altertable t18 dropprimarykey;
添加主键
altertable t18 add priamry key(id);
复合主键
创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,
createtable t19(ip varchar(30)comment'IP',
port intunsignedcomment'断开'
priamry key(ip,port));
只有当两个都相同才会产生主键冲突
自增长auto_increment
createtableifnotexists t19(
id intunsignedauto_incrementcomment'自增长字段',
name varchar(10)NOTNULLcomment'用户名');
可以自己插一个值,然后他会从前面中取最大值然后进行增长
一般在设置主键的时候,建议设置成与业务无关的数据字段来充当主键,
自增长属性!
注意这个关键字必须用在主键或者下面讲到的唯一键之后
ERROR 1075(42000): Incorrect table definition; there can be only one auto columnand it must be defined as a key
唯一键unique
表中很多字段需要唯一性,但是主键只有一个。
例如学生存在大量唯一性的信息:学号,身份证号,电话
不是主键具有唯一性,而是唯一性的数据被选择成为了主键
假设用学号作为主键,那么其它唯一性属性怎么办?万一上层用户插入大量重复值,但是主键符合要求
唯一间目的不在于类似主键一般,保证数据的绝对唯一性,目的在于,其它非主键字段,如果也想要有一定的唯一性,就可以设置改变列的唯一性约束
唯一性约束的本质在于让我们的数据更安全,完整性更高
唯一键修饰的列可以为null,null不做唯一性比较,唯一键+not null与主键功能类似
createtableuser(
id intunsignedprimarykeyauto_incrementcomment'主键',
vip_id intunsignedcomment'vip账号',
name varchar(10)notnullcomment'vip用户姓名');
添加唯一键
altertableuseraddunique(vip_id);
altertableuseradd telphone varchar(11)unique;
外键 freign key… references ….
一般我们不会只有一只表,例如在刚入学的时候要进行分班,那么学生表里面有一个班级id,这个班级id就必须是在班级表中出现过的,借助外键,我们就可以完成这一限制,建立表与表之间的联系
外键存在的意义是建立表和表之间的关系
外键和外键约束是不同的概念
createtableifnotexists classes (
id intunsignedprimarykeycomment'班级id标识信息',
name varchar(20)notnullcomment'这个班级的名字',)
createtableifnotexists std(
stu_id intunsignedprimarykey,
stu_name varchar(20)notnull
class_id intnotnull,foreignkey(class_id)references classes(id))
版权归原作者 落禅 所有, 如有侵权,请联系我们删除。