数据库02
一.存储引擎
1.1什么是存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。
1.2主要的四种存储引擎
INNODB:现默认的存储引擎,读取数据较myisam慢,但是数据存储更安全
MYISAM:mysql之前版本使用的默认存储引擎
MEMORY:内存引擎(断电/重启存储的数据会消失,数据存储再内存上)
BLACKHOLE:黑洞引擎(存入的数据会消失)
1.3引擎的特点
使用sql语句查看引擎:show engines:
创建表,对表中插入数据
ps: q3是内存引擎,数据存储再内存中的所以不存在数据
q4是黑洞引擎,数据写入其中就消失了,所以也没有数据
ps:重启MySQL服务后,之前使用Memory引擎存储的数据都会被清除
创建表的完整语法: create table 表名( 字段名1 字段类型[(宽度) 约束条件], 字段名2 字段类型[(宽度) 约束条件], 字段名3 字段类型[(宽度) 约束条件]); #ps:1.最后一个字段别加逗号 2.字段名和字段类型是必须写的,宽度和约束条件可以不写 3.字段名不能重复 宽度:对存储的数据进行限制(再使用数据库时应该尽量减少数据库的操作) eg:char(1) 只能存取1个字符 假设存取的数据为'zhang'则可能出现以下两种情况 1.开启严格模式:Data too long for column 'name' at row 1 2.未开启严格模式:只能存入'z' #ps:怎么查看数据库配置中包含modle的参数 sql语句:show varuables like '%mode%'; 设置严格模式语句:set global sql_mode ='STRICT_TRANS_TABLES' #ps:再设置严格模式时,若sql_mode中包含别的模式时,再设置语句中需将别的模式也加上,因为这个是指语句是类似替换类型的.
二.数据类型
2.1整型
整数类型:TINYINT,SMALLINT,INT,BIGINT
作用:用来存储年龄,电话号码,身份证号码等
当字符类型是TINYINT时:
ps:默认的存储方式是有符号的,当存储的值超过范围时会报错
修改存储方式为无符号形式的:
alter table 表名 modify 字段名 tinyint unsigned;
ps:当原表中存在有符号的数时,貌似不能修改为无符号的形式????(严格模式下不能修改)
再不加余数条件之前,表中是可以输入为空的如下图:
修改限制条件使其不能输入空:
alter table 表名 modify id not null;
ps:当原表中存在有符号的数时,貌似不能修改为无符号的形式????(还是严格模式下不能修改???)
再创建表时,可以再int或者整型数据后添加一个数字,改数字表示展示的位数,如int(8),表示展示8为数字出来,若输入的数字不足8位,用空格补齐,若超过8位则展示原数字.(ps:只有整型是表示展示位数,其余的类型都是表示类型的宽度)
2.2浮点型
1.float:(255,30)
2.double:(255,30)
3.decimal:(65,30)
ps:括号内数字表示,第一个参数表示总的位数,第二个参数表示小数部分的位数,其中区别在于精度的不同(float < double < decimal)
2.3字符类型
1.char(8):存储数据固定长度为8位,超过会报错,没超过用空格填充,存储速度较varchar慢,读取较varchar快,但是存储会浪费空间
2.varchar(8):存储的数据是变长的,8个以内给什么存什么,8个以外报错,再存取时会给数据加上一个固定字节的报头,以便去数据时知道所取得数据长度,不至于造成数据得混乱
ps:由于mysql再取出数据时会对取出得数据进行去空处理,所以读取出的长度就是所存入得.
限制MySQL再取出数据时不去空:
2.4日期类型
1.data:年月日
2.time:时分秒
3.datatime:年月日时分秒
4.year:年
2.5枚举和集合类型
1.enum(枚举):多选一,类似注册时让用户选择性别男或女:
2.set(集合):多选多或者一,注册时爱好的选择,可以是多个可以是单个的
三.约束条件
1.not null:不能为空
2.default:默认值
3.primary key:主键
ps:只从约束来说primary key=unique + not null
ps:除了约束之外,主键还是INNODB引擎组织数据的一句,提升查询效率(主键就类似于书的目录)
INNODB引擎在创建一个表时有且只有一个主键:
当创建表时没有指定主键:
1.会将非空且唯一的字段当作主键(从开始依次往下寻找,第一个做为主键)
2.若没有非空且唯一的字段,INNODB会自动产生一个主键,但是该主键字段在查询的时候是无法使用的,这就意味着查询速度的下降
3.一般一张表中都会有一个id字段,通常都是将id字段当作主键
联合主键(实质上还是一个主键)
4.unique:唯一
1.单列唯一
2.联合唯一
5.auto_increment:自动递增
ps:当用delete删除表中数据后,id依旧从之前的位置开始递增,不会从1开始(这是好的,因为这样可以知道在这之中有多少数据是被自己丢弃的)
所以,delete from 表名不是用来删除表数据的,而是删除表中某个特定的数据如:
delete from a2 where id=3;
如果想要清除表数据,且主键的排序从1开始可以使用truncate
truncate 表名;