MYSQL--存储引擎、数据类型、约束条件、
存储引擎:
不同的数据应该有不同的处理机制
mysql存储引擎:http://www.cnblogs.com/linhaifeng/articles/7213670.html
5.1可以使用innodb插件
5.5.5以上默认Engine是Innodb,其他版本默认是MyISAM
Innodb:默认的存储引擎 查询速度相比于myisam慢 但是更安全
建标的时候会产生两个文件1、表结构文件2、一个是存储数据文件
myisam:mysql老版本用的存储引擎
产生三个文件1、表结构文件2、索引文件3、存储数据文件
memory:内存引擎(数据全部存在内存中),电脑重启之后,数据都会丢失
建标的时候仅仅只有一个表结构文件
blackhole:无论存什么都立刻消失(黑洞)
show engines;
数据类型:
创建表的完整语法:
create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] );
注意:
1、字段名和字段类型都是必须的 中括号内的参数都是可选的参数
2、同一张表中字段名不能重复
3、最后一个字段后面不能加括号
宽度:(使用数据库的准则:尽可能让它少干活)
对存储数据的限制
char(1) 只能存一个字符如果超过了mysql会自动帮你截取或者直接报错(mysql中的严格模式)
alter table tablename modify name char not null; not null(该字段不能为空)
类型和中括号内的约束:
类型约束的是数据的存储类型
而约束是基于类型之上的额外的限制
字段类型:
整形: SMALLINT TINYINT(1bytes) INT(4bytes) BIGINT (默认都是带正负号的)
=================有符号:默认有符号,即数字前有正负号=========== create table t1(id tinyint); insert into t1 values(-128); #插入成功 insert into t1 values(-129); #插入失败,5.7版本报错:ERROR 1264 (22003): Out of range value for column 'id' at row 1。之前版本不会报错,会将 -129 存成 -128 insert into t1 values(127); #插入成功 insert into t1 values(128); #插入失败,5.7版本报错。之前版本不会报错,会将128存成127 ===================无符号:范围在 0~255====================== create table t2(id tinyint unsigned); insert into t2 values(-1); 插入失败,5.7之前版本会将 -1 存成 0。 其余结果就不一一演示了。 ===================zerofill测试整数类型的显示宽度=============================== mysql> insert into zerofilltable values(1),(11),(111),(1111) mysql> select * from zerofilltable; +------+ | id | +------+ | 001 | | 011 | | 111 | | 1111 | +------+ 4 rows in set (0.00 sec)
TINYINT:默认是带有符号的(-128,127),超出这个限制之后会存最大值或最小值
create table tablename(id TINYINT);
not null 不能为空
unsigned 无正负符号
zerofill 0填充多余的位数
char后面的数字是用来限制存储数据的长度的
特例:只有整型后面的数字不是用来限制存储数据的长度的 而是用来控制展示数据的位数的
int(8) 够/超8位有几位存几位,不够8位就用空格填充,不能超出int的最大范围
强调:对于整型来说,数据类型后的宽度并不是存储限制,而是限时限制,所以在创建表的时候,如果字段采用的是int类型,完全可以不指定限时宽度,默认的限时宽度,足够显示完整当初存放的数据
模糊匹配:
like
%:匹配任意多个字符
_:匹配任意一个字符
set session 临时有效 只在你当前操作的窗口有效
set global全局有效 终生有效
设置完成之后,你需要重新退出再次登陆就OK了
浮点型:通常情况下会将数字在数据库存储上变成字符串来方便存储 不需要考虑精度带来的问题
float(255,30) 总共255位 小数部分占30位
double(255,30) 总共255位 小数部分占30位
decimal(65,30) 总共65位 小数部分占30位
create table t12(id FLOAT(255,30));
create table t13(id DOUBLE(255,30));
create table t14(id DECIMAL(65,30));
精确度:float < double < decimal
字符类型
char(4):最大只能存4个字符超出就会直接报错 如果少了 会自动用空格填充
varchar(4):最大只能存4个字符 超出就会直接报错 如果少了 有几个就存几个(Django中默认使用varchar)
create table t15(name char(4));
create table t16(name varchar(4));
char_length():
msyq在存储char类型字段的时候 硬盘上确确实实存在的是固定长度的数据,但是在取出来的那一瞬间,mysql就会自动将填充的空格去除(可以通过严格模式,来修改该机制 让其不做自动去处处理)
char与varchar的区别:
char取的时候方便直接按固定的长度取就可以
varchar:取得时候比较繁琐,无法是知道数据到底有多长
char定长:
1、浪费空间
2、存取速度快
varchar变长:
1、节省空间
2、存取速度慢(相对于char比较慢)
存的时候 需要先给数据一个记录长度的报头
取的时候 需要先读取报头才能读取真是数据
日期类型
mysql> create table t2(d date, t time, dt datetime); Query OK, 0 rows affected (0.03 sec) mysql> insert into t2 values(now(), now(), now()); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t2; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2019-08-19 | 23:32:13 | 2019-08-19 23:32:13 | +------------+----------+---------------------+ 1 row in set (0.00 sec) ==============================================timestamp================================== mysql> create table t3(timestamp_ timestamp); Query OK, 0 rows affected (0.02 sec) mysql> insert into t3 values(now()); Query OK, 1 row affected (0.01 sec) mysql> select * from t3; +---------------------+ | timestamp_ | +---------------------+ | 2019-08-19 23:35:12 | +---------------------+ 1 row in set (0.00 sec) ==============================================year======================================= mysql> insert into t1 values(now()); Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +-----------+ | born_year | +-----------+ | 2001 | | 1990 | | 2017 | | 2019 | +-----------+ 4 rows in set (0.00 sec) 1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入 2. 插入年份时,尽量使用4位值 3. 插入两位年份时,<=69,以20开头,比如50, 结果2050 >=70,以19开头,比如71,结果1971 MariaDB [db1]> create table t12(y year); MariaDB [db1]> insert into t12 values -> (50), -> (71); MariaDB [db1]> select * from t12; +------+ | y | +------+ | 2050 | | 1971 | +------+
date:年月日
datetime:年月日时分秒
year:年
time:时分秒
枚举和集合类型
枚举:(多选一)enum限制某个字段能够存储的数据类型,不存在就直接报错
mysql> create table shirts( -> name varchar(40), -> size enum('s', 'l', 'x', 'xxl')); Query OK, 0 rows affected (0.02 sec) mysql> insert into shirts values('dress', 's'), ('youyiku', 'x'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from shirts; +---------+------+ | name | size | +---------+------+ | dress | s | | youyiku | x | +---------+------+ 2 rows in set (0.00 sec) =====================================只插入一个值==================================== mysql> insert into shirts(name) values('haha'); Query OK, 1 row affected (0.00 sec) mysql> select * from shirts; +---------+------+ | name | size | +---------+------+ | dress | s | | youyiku | x | | haha | NULL | +---------+------+ 3 rows in set (0.00 sec) ===========================枚举类型不一致会报错========================================= mysql> insert into shirts values('der', 'asd'); ERROR 1265 (01000): Data truncated for column 'size' at row 1
集合:(多选多)set限制某个字段能够存储的数据内容
mysql> create table teacher( -> id int, -> name char(16), -> gender enum('male', 'female', 'others'), -> hobby set('pingpang', 'basketball', 'soccer')); Query OK, 0 rows affected (0.02 sec) =========================插入========================= mysql> insert into teacher values(1, 'egon', 'male', 'soccer,pingpang'); Query OK, 1 row affected (0.00 sec) 注意:插入的时候,set多选的值之间不能有其他的东西,如多了个空格之类的神奇玩意; ========================查询==================== mysql> select * from teacher; +------+------+--------+-----------------+ | id | name | gender | hobby | +------+------+--------+-----------------+ | 1 | NULL | female | soccer | | 1 | egon | male | soccer | | 1 | egon | male | pingpang,soccer | +------+------+--------+-----------------+ 3 rows in set (0.00 sec)
约束条件:
not null:不能为空
unique:唯一
单列唯一:
限时某一个字段是唯一的
联合唯一:
在语句的最后用括号的形式,表示哪几个字段组合的结果是唯一的
default:给某个字段设置默认值(当用户写了就用用户写的,没有的话就用默认的)
create table t17(id int,name char(16) default 'william';
primary key:主键
限制效果跟not null + unique 组合效果一致 非空且唯一
create table t18(id int primary key);
primary key也是innodb引擎查询必备的索引,索引可以当成书的目录
innodb引擎在创建表的时候 必须要有一个主键,当你没有指定主键的时候:
1、会将非空且唯一的字段自动升级为主键
2、当你的表中没有任何的约束条件的时候 innodb会采用自己的内部默认的一个主键字段,该主键字段你在查询的时候是无法使用的,查询数据的速度就会变得很慢,就好像是一页一页翻书
通常每张表都应该有一个id字段,并且应该将id设置为表的主键字段
联合主键:多个字段联合起来作为表的一个主键, 本质还是一个主键!!!
ps:innodb引擎中一张表有且只有一个主键
auto_increment:自动递增,该约束条件只能被家在设置成key的字段上,不能单独使用,通常都是和primary key联合使用
delete from :仅仅是删除数据没 不会重置主键
truncate:初始化表 会重置主键