【MySQL】数据类型与表约束
目录数据类型分类
数值类型
tinyint类型
bit类型
小数类型
字符串类型
日期和时间类型
enum和set
表的约束
空属性
默认值
列描述
zerofill
主键
自增长
唯一键
外键
数据类型分类
https://i-blog.csdnimg.cn/direct/2422c6ba58454c6eb7f443fff041ea97.png
数值类型
https://i-blog.csdnimg.cn/direct/214d093c446f4626818608439c312fe4.png
tinyint类型
https://i-blog.csdnimg.cn/direct/3eb04fb749a048f69be80c0463f8e44f.png
https://i-blog.csdnimg.cn/direct/7ac8f40b3baa4127b5d75673390721f9.png
[*]MySQL中,整形可以是有符号和无符号的,默认有无符号的。
[*]可以通过unsigned来说明某个字段是无符号的。
[*]假如我们向MySQL特定的的类型中插入不正当数据,MySQL是直接拦截,不让我们做对应的操作(这一点和语言差别)。反过来,假如已经有数据被成功插入到MySQL中了,一定插入的时间是正当的。所以,MySQL中,数据类型本身也是一种约束。
bit类型
bit[(M)],M表示每个值的位数,范围从1到64。假如忽略M,那么默认是1。
https://i-blog.csdnimg.cn/direct/0709eca3f77f454990d63a98ac4d74e0.png
[*]bit字段在显示时,是按照ASCII码对应的值显示;
小数类型
float
float[(m,d)]:m显示指定长度,d指定小数位数,占用4字节。
比方,float(4,2)表示的范围是-99.99~99.99,MySQL在保存值会举行四舍五入(99.991->99.99)。假如界说的是float(4,2)unsigned,范围是0-99.99。
decimal
decimal(m,d):m显示指定长度,d指定小数位数。
[*]decimal(5,2)表示的范围是-999.99-999.99
[*]decimal(5,2)unsigned表示的范围是0-999.99
[*]decimal和float很像,只是精度不一样,decimal更准确。
字符串类型
char
char(L):固定长度字符串,L是可以存储的长度,单位是字符,最长可以是255。
这里的char和语言中的char不一样,char(2)可以存放两个字符,可以是字母或汉字,但是不能凌驾2个,最多是255个。
varchar
varchar(L):可变长度字符串,L表示字符长度,最长为65535个字节。
L是这个字符串长度的上限,其真实长度可能小于即是这个长度。
[*]varchar字节数可以指定为0-65535之间的值,但有1-3个字节用于记载数据大小,所以有效字节数是65532;
[*]当表的编码是utf8时,varchar(n)的最大值是65532/3=21844(utf8中一个字符占用3个字节)。
char和varchar的比力
https://i-blog.csdnimg.cn/direct/099a52913d974c638bc2a000db5a4b91.png
如何选择定长或变长字符串?
[*]假如数据确定长度都一样且不变,那就使用char,比如,身份证,手机号。假如数据长度有变化,那就使用varchar,比如,名字,地址,但是要保证最长的能存进去。
[*]定长的磁盘空间比力浪费,但是效率高;变长的磁盘空间比力节省,但是效率低。
[*]定长的意义是,直接开辟好对应的空间;变长的意义是在不凌驾自界说范围的情况下,用多少开辟多少。
日期和时间类型
常用的日期有如下3个:
[*]date:日期‘yyyy-mm-dd’,占用三个字节;
[*]datetime时间日期格式‘yyyy-mm-dd HH:ii:ss’,占用8字节;
[*]timestamp:时间戳,和datetime格式完全同等,占用4字节。
当对表举行更新时,timestamp数据(假如有)自动更新。
enum和set
enum:罗列,单选类型,enum('选项1','选项2',...)。这些选项值依次对应1 2 3 4 5 6...。
set:集合,多选类型,set('选项1','选项2',...)。在插入时,假如传入多个选项,可以使用逗号分隔符传进去,也可以用数组下标(位图方式表示,这些选项的每个选项值依次对应如下数字,1 2 4 8 16 32...)。
创建表:
https://i-blog.csdnimg.cn/direct/697c84c2aa00418e95eb4e8b7a3eddb0.png
插入数据:
https://i-blog.csdnimg.cn/direct/e3ab1d53289a440397036b63cda3a122.png
想查询所有喜欢爬山的人:
https://i-blog.csdnimg.cn/direct/f35c26563cd64d4eb172d00c8a49c73f.png
如许查询不能查出所有结果。
集合查询函数find_in_set函数:
find_in_set(sub,str_list):假如sub在str_list中,那么返回下标(非0);假如不在,返回0。
https://i-blog.csdnimg.cn/direct/c1a6c984e61f41738236d982c540d240.png
查询爱好爬山的人:
https://i-blog.csdnimg.cn/direct/55a54bb85b594f658251acf573088ad4.png
查询爱好爬山和篮球的人:
https://i-blog.csdnimg.cn/direct/a0c6e6a343634b6bbc1d9a7ef26f8db3.png
表的约束
表的约束,表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的,约束本质是通过技术手段,倒逼步伐员,插入正确的数据。反过来,站在MySQL的角度,凡是插入进来的数据,都是符合数据约束的!
约束的最终目标:保证数据的完整性和可预期性。
空属性
[*]两个值:null(默认)和not null;
例子:创建一个表,包含班级名称和所在课堂,这两个字段不能为空。
https://i-blog.csdnimg.cn/direct/84718da06a0240dc8de6e5428e420c9f.png
当插入数据时,假如没有给not null的字段传入值,那么会报错。
默认值
default:假如设置了,用户将来插入,有具体的数据,就用用户的,没有就用默认的。
https://i-blog.csdnimg.cn/direct/a8726cb4f1dd4fd7809b5e4a6d61881a.png
如下图,假如我们没有明确指定一列要插入,用的是default,假如建表中,对应列没有默认的default值,则无法直接插入。
https://i-blog.csdnimg.cn/direct/e740aa085a604855be40eb355c5f192c.png
default和not null不冲突,而是相互补充的,not null是当用户想插入的时间,约束的是,要么是NULL,要么是正当数据。而default是当用户忽略这一列的时间,使用默认值(假如设置了),假如没有设置,直接报错!
列描述
comment,没有实际含义,会根据表创建语句保存,用来给步伐员看的举行了解。
https://i-blog.csdnimg.cn/direct/4262f7195d744a1daa3adf75b6b6be1b.png
通过show语句可以检察comment:
https://i-blog.csdnimg.cn/direct/2b09cb54169b4f13b69f4ceccc0d03f8.png
zerofill
https://i-blog.csdnimg.cn/direct/d9b9668091354d849ac65c989265bec9.png
我们看到int(10),这个10代表什么?实际上,假如没有zerofill这个属性的话,括号内的数字毫无意义。
假如没有设置zerofill,那么显示结果是:
https://i-blog.csdnimg.cn/direct/457505468b9f453ba25cbd1e110bcc96.png
假如设置了zerofill属性,那么显示结果是:
https://i-blog.csdnimg.cn/direct/a459c38665ad4f51a3528c6f0454244b.png
这就是说,假如宽度小于设定的宽度,自动填充0。这只是最后显示的结果,实际存储的还是200,我们可以通过hex函数证明:
https://i-blog.csdnimg.cn/direct/215ce0eb232b4760993ee61ffbe68138.png
主键
主键:primary key用来唯一约束该字段里的数据,不能重复,不能为空(自动设置为not null),一张表中最多有1个主键,主键所在的列通常是整数类型。
案例:
[*]创建表的时间直接在字段上指定主键;
https://i-blog.csdnimg.cn/direct/83069032d36740b0978c607fa6ebfdf2.png
https://i-blog.csdnimg.cn/direct/8988d3da9d4448f0920fcff7312f4d02.png
[*]主键中的字段不能重复,一旦重复就会失败;
https://i-blog.csdnimg.cn/direct/21d0c7d933e841c8a832cfb844aa0348.png
[*] 删除主键
https://i-blog.csdnimg.cn/direct/2898f09e77564852879e32c3f77883fd.png
[*]当表创建好但是还没主键的时间,可以再次追加主键;
https://i-blog.csdnimg.cn/direct/09589c66af9e4bc2a63b90bddd132601.png
[*]复合主键
在创建表的时间,在所有字段之后,使用primary key(主键字段列表)来创建主键,假如有多个字段作为主键,可以使用复合主键。
https://i-blog.csdnimg.cn/direct/0e9d4d111f564a16bf7401352e28a5ee.png
https://i-blog.csdnimg.cn/direct/27e190c82f6b4c7d8bd1429cfddc2b95.png
自增长
auto_increment:对应的字段,不给值,会自动被体系更新,体系从当前字段中已有的最大值+1,得到一个新的差别的值,通常和主键搭配使用,作为逻辑主键。
自增长有如下特点:
[*]任何一个字段要做自增长,前提本身是一个索引。
[*]自增长字段必须是整数。
[*]一张表最多只能有一个自增长。
https://i-blog.csdnimg.cn/direct/66a7ca2b79764358a9d868ec0bd13c66.png
https://i-blog.csdnimg.cn/direct/24e97da2a18e4b6f9e43358dcd346c2d.png
https://i-blog.csdnimg.cn/direct/0a5cdcf897974581bbec59f60b3bc619.png
假如插入主键值,那下次从这个值开始自增长。
https://i-blog.csdnimg.cn/direct/701f6dd57428450699ee66a489cfc712.png
通过last_insert_id()查询上次插入的键值。
唯一键
一张表中每每有多个字段需要唯一性,数据不能重复,但是一张表中只能有一个主键;唯一键就可以办理表中有多个字段需要唯一性约束的问题。唯一键的本质和主键差不多,但唯一键允许为空,且可以多个为空,空字段不做唯一性比力。
唯一键和主键的区别:主键更多的是标识唯一性的,而唯一键更多是保证在业务上,不要和别的信息出现重复。比如在员工管理体系,可以将员工身份证号作为主键,同时为了保证员工号不出现输入重复错误,可以将员工号作为唯一键。
一般把和业务无关的字段设为主键,如许当业务调解的时间,就不会对主键做过大的调解。
https://i-blog.csdnimg.cn/direct/c4d3cb0b9f114ad595fa5cf42554c4a9.png
外键
外键用于界说主表和从表之间的关系:外键约束重要界说在从表上,从表则必须是有主键约束或unique约束。当界说外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
foreign key (字段名) references 主表(列) https://i-blog.csdnimg.cn/direct/e7801b3dd2594b0881e962e41dae3c4d.png
创建主表:
https://i-blog.csdnimg.cn/direct/4c4fe11a56f441928e2c34c803ad28e0.png
创建从表:
https://i-blog.csdnimg.cn/direct/56dbb271036b4d13b577dc02b23eb05c.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]