数据库2
存储引擎:
innodb: 现在数据库使用的默认引擎 与myisam相比,速度较慢,但是数据安全性更高(数据安全体现在行锁, 事务方面)
使用innodb创建表时,在库下默认创建两个文件,分别是frm和idb, frm表示存储表结构的文件, idb表示存储数据的文件
myisam: 老版本数据库使用的存储引擎
使用myisam创建表时,在库下默认创建三个文件, 分别是frm MYD MYI , frm表示存储表结构的文件, MYD表示存储数据的文件, MYI表示索引文件
blackhole: 黑洞,不管存储什么数据直接丢失
使用blackhole创建表时,在库下默认创建一个文件, frm , frm表示存储表结构的文件
memory: 内存引擎,临时存储在内存,服务重启数据丢失
使用memory创建表时,在库下默认创建一个文件, frm, frm表示存储表结构的文件
如何查询数据库中有哪些的引擎呢? show engines;
创建表的完整性约束:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意:
1.字段名和字段类型是必须的,中括号内的参数都是可选参数
2.同一张表中的字段名不能重复
3.最后一个字段后不能加逗号
宽度:
对存储数据的限制
char(1) 只能存储一个字符,如果要存储的字符数超过了char中的限制个数,则mysql会自动截取,mac和mysql5.7及以上版本会报错,因为启用了mysql的严格模式
如何不让用户在字段中插入NULL呢? 如果之前有NULL字段,使用完下面的SQL语句会自动把之前的NULL清空
alter table 表名 modify 字段名 char not noll
类型和中括号内的约束:
类型约束的是数据的存储类型, 而约束是基于类型之上的额外限制
整形类型:
更改成无符号
关键字:unsigned
alter table 表名 modify id TINYINT unsigned;
char(8) : char括号中的数字用来限制储存数据的长度
int(8) : int括号中的数字用来控制展示的数据的位数, 如果添加的数据不够8位, 则默认使用空格填充到8位, 如果超过8位, 则添加什么数据就显示什么数据. 如何把使用空格填充的改成使用数字0填充呢
关键字: zerofill
create table 表名 values(id int(8) zerofill);
强调:
对于整形来说,数据类型后的宽度并不是存储限制, 而是现实限制,所以在创建表时, 如果字段采用的是整形类型,完全无需指定显示宽度,默认的显示宽度,足够显示完整当初存放的数据
严格模式:
为什么要使用严格模式呢?
因为在使用char字段类型的时候, 默认为1个字符, 如果插入多个字符, mysql则会自动截取第一个字符直接保存到表中, 但是这时的数据是不正确的,我们使用严格模式就是为了在插入错误的数据时, 让数据库给出报错信息, 可减轻数据库的压力,是一个可以优化数据库的点
如何查看严格模式?
show variables like "%mode%";
模糊匹配
关键字:like
%: 匹配任意多个字符
_: 匹配任意一个字符
set session : 修改的严格模式临时有效,只在当前操作的窗口有效
set global : 修改的严格模式全局有效,永久有效
set global sql_mode = 'STRICT_TRANS_TABLES';
注意: 在修改完严格模式后,需要退出客户端再进入客户端才能生效
浮点型:
FLOAT(255, 30) : 总共255位,小数部分占30位
DOUBLE(255, 30) : 总共255位, 小数部分占30位
DECIMAL(65, 30) : 总共60位,小数部分占30位
创建浮点型类型的字段:
create table 表名 (id FLOAT(255, 30)); create table 表名 (id DOUBLE(255, 30)); create table 表名 (id DECIMAL(65, 30));
三者之间的区分就是精确度的问题:
插入数据可查看具体精确度
FLOAT < DOUBLE < DECIMAL
字符类型:
char(4) : 最大只能存四个字符, 超出的话会报错, 如果少了, 自动使用空格填充
varchar(4) : 最大只能存四个字符, 超出的话会报错, 如果少了,有几个字符就存几个字符
create table 表名 (name char(4))
create table 表名 (name varchar(4))
mysql在存储char类型字段的时候, 硬盘上确确实实存在的是固定长度的数据, 但是在取出来的那一瞬间, mysql会自动将填充的空格去除,那么如何将取出时数据的长度和存入时数据的长度保持一致呢?可以通过修改严格模式, 来不让mysql去做处理, 要写上之前的严格模式
set global sql_mode = "strict_trans_tables, PAD_CHAR_TO_FULL_LENGTH"
注意: 需要退出客户端, 重新登陆, 严格模式才能生效
如何查看长度?
select char_length(name) from 表名
char和varchar的区别
char定长:
1.浪费空间
2.存取速度快
varchar变长:
1.节省空间
2.存取速度快(较于char)
存的时候, 需要给数据一个记录长度的报头
去的时候, 需要先读取报头才能读取真是的数据
枚举与集合:
枚举(enum) : 限制某个字段能够存储的数据内容
集合(set) : 限制某个字段能够存储的数据内容
约束条件:
default 给某个字段设置默认值(当用户写了的时候用用户的,没写就用默认值)
create table 表名(id int, name char(16) default 'zhangsan');
插入数据
insert into 表名(name, id) vlaues('lisi', 2);
unique : 单列唯一,一般在id标识时使用,id具有唯一性
create table 表名( id int unique, name char(16) )
unique : 联合唯一(在语句的最后,用括号的形式,表示哪几个字段是联合唯一的)
create table 表名( id int, ip char(16), port int, unique(ip, port) )
primary key : 主键 (限制效果跟not null + unique 组合效果一致, 非空且唯一)
create table 表名(id int primary key)
primary key 也是innodb引擎查询必备的索引, innodb引擎在创建表的时候,必须要有一个主键
当你没有指定主键的时候
1.会将非空且唯一的字段自动升级成主键
2.当你的表中没有任何的约束条件, innodb会采用自己的内部默认的一个主键字段,该主键字段你在查询时是无法使用的,查询数据的速度就会很慢
联合主键 : 多个字段联合起来作为标的一个主键, 本质还是一个主键
innodb引擎中一张表有且只有一张主键
create table 表名( ip char(16), port int, primary key(ip, port) );
主键字段应该具备自动递增的特点,每次添加数据,不需要用户手动输入
auto_increment 自动递增
create table 表名(id int primary key auto_increment, name varchar(16))
delete from 仅仅是删除数据,不会重置主键
truncate 表名 (初始化表,会重置主键)