目录
MySQL存储引擎
什么是存储引擎?
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。用于根据不同的机制处理不同的数据
提示:InnoDB
事务型数据库的首选引擎,支持事务安全表(ACID),行锁定 和 外键。( 事务主要用于处理操作量大,复杂度高的数据)
MySQL
5.5.5 之后,InnoDB
作为默认存储引擎。
查看MySQL
中所有引擎
show engines
create table t1(id int)engines=innodb; #创建引擎为innodb的表
myisam
:5.5以前老的版本使用的存储引擎,拥有较高的插入,查询速度,但不支持事物
blackhole
:类似于队列中的数据,存进去消失
memory
:通电数据存在,断电丢失
创建表完整的语法
约束条件:可有可无
宽度:限制某些数据类型的存储大小
非空约束
在创建表时可以用NOT NULL关键字设置非空约束
<字段名><数据类型> NOT NULL
实例:
mysql> create table t6(
id int not null
);
Query OK, 0 rows affected (0.25 sec)
mysql> desc t6;
------- --------- ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
------- --------- ------ ----- --------- -------
| id | int(11) | NO | | NULL | |
------- --------- ------ ----- --------- -------
字段类型
整形类型INT TINYINT
SMALLINT MEDIUMINT BIGINT
整形类型又称数值型数据,主要用来存储数字。
类型名称 | 说明 | 存储需求 |
---|---|---|
TINYINT | 很小的整数 | 1个字节 |
SMALLINT | 小的整数 | 2个宇节 |
MEDIUMINT | 中等大小的整数 | 3个字节 |
INT (INTEGHR) | 普通大小的整数 | 4个字节 |
BIGINT | 大整数 | 8个字节 |
从上表中可以看到,不同类型的整数存储所需的字节数不相同,占用字节数最小的是 TINYINT 类型,占用字节最大的是 BIGINT 类型,占用的字节越多的类型所能表示的数值范围越大。
类型名称 | 说明 | 存储需求 |
---|---|---|
TINYINT | -128?127 | 0 ?255 |
SMALLINT | -32768?32767 | 0?65535 |
MEDIUMINT | -8388608?8388607 | 0?16777215 |
INT (INTEGER) | -2147483648?2147483647 | 0?4294967295 |
BIGINT | -9223372036854775808?9223372036854775807 | 0?18446744073709551615 |
实例:tinyint 范围 -128?127
create table t7(
id tinyint
);
实例:int 范围 -2147483648?2147483647
create table t8(
id int
);
若插入超过设定宽度,则正常显示
若插入不足,则以空格不全
浮点类型float
DOUBLE 双精度浮点数
DECIMAL 压缩的“严格”定点数
三种浮点型的区别在于 精确到不一样
应用场景:工资,身高,体重。。。
实例:
create table t9(sal float(255,30)) #范围255是最大长度(包括.小数),30代表的是小数的位数
字符类型char varchar
类型名称 | 说明 | 存储需求 |
---|---|---|
CHAR(M) | 固定长度非二进制字符串 | M 字节,1<=M<=255 |
VARCHAR(M) | 变长非二进制字符串 | L 1字节,在此,L< = M和 1<=M<=255 |
TINYTEXT | 非常小的非二进制字符串 | L 1字节,在此,L<2^8 |
TEXT | 小的非二进制字符串 | L 2字节,在此,L<2^16 |
MEDIUMTEXT | 中等大小的非二进制字符串 | L 3字节,在此,L<2^24 |
LONGTEXT | 大的非二进制字符串 | L 4字节,在此,L<2^32 |
ENUM | 枚举类型,只能有一个枚举字符串值 | 1或2个字节,取决于枚举值的数目 (最大值为65535) |
SET | 一个设置,字符串对象可以有零个或 多个SET成员 | 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员) |
CHAR(M) 为固定长度字符串,应用场景:手机号,身份证,银行卡号。。。
长度范围是 0~255. 当你想要储存一个长度不足 255 的字符时,Mysql 会用空格来填充剩下的字符
优点:速度快
缺点:浪费空间
VARCHAR()为可变字符类型,存几个字符,就是几个字符的大小,每个字符前都要 1bytes,最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。
优点:节省空间
TEXT() 保存非二进制字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。
与 char 和 varchar 不同的是,text 不可以有默认值,其最大长度是 2 的 16 次方-1
日期类型
每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
YEAR | YYYY | 1901 ~ 2155 | 1 个字节 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3 个字节 |
DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-3 | 3 个字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 个字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | 4 个字节 |
date:2019-12-11
datetime:2019-12-11 15:50:55
time:15:50:55
year:2019
timestamp:时间戳
时间戳实例:
mysql> insert into t11 values(1,null);
Query OK, 1 row affected (0.04 sec)
mysql> select * from t11;
------ ---------------------
| id | create_time |
------ ---------------------
| 1 | 2019-12-11 15:53:24 |
------ ---------------------
create table student(
id int,
name varchar(4),
birth date,
register datetime,
work_time year,
t_time time,
update_time timestamp
);
python 插入时间数据时,转成str类型
枚举集合
enum
:多选一
create table t12(
id int,
name varchar(10),
gender enum('male','female')
);
mysql> insert into t12 values(1,'letin','male');
Query OK, 1 row affected (0.05 sec)
set:多选一 或 多选多
create table t13(
id int,
name varchar(10),
hobbies set('swimming','game','study')
);
mysql> insert into t13 values(1,'letin','swimming,game,study');
Query OK, 1 row affected (0.06 sec)
mysql> select * from t13;
------ ------- ---------------------
| id | name | hobbies |
------ ------- ---------------------
| 1 | letin | swimming,game,read |
------ ------- ---------------------
1 row in set (0.00 sec)
约束条件
unique将某个字段设置为唯一的值
not null unique 变为主键
create table t14(
id int not null unique,
name varchar(10)
);
mysql> insert into t14 values(1,'letin');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t14 values(1,'leiting');
ERROR 1062 (23000): Duplicate entry '1' for key 'id' #id设置了唯一,重复后会报错
主键 自增
primary key-–-–-–>not null unique
主键就是表中的索引:可以通过索引快速查找某些数据
主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则:
- 每个表只能定义一个主键。
- 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值
主键实例:
mysql> create table t15(
-> id int primary key,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.19 sec)
主键自增实例:primary key auto_increment
mysql> create table t16(
-> id int primary key auto_increment,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.20 sec)
mysql> desc t16;
------- ------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
------- ------------- ------ ----- --------- ----------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | YES | | NULL | |
------- ------------- ------ ----- --------- ----------------
2 rows in set (0.00 sec)
自增默认从1开始
mysql> insert into t16(name) values('letin');
Query OK, 1 row affected (0.04 sec)
unsigned无符号
mysql> create table t17(
-> id int unsigned
-> );
Query OK, 0 rows affected (0.19 sec)
插入数字是不能带符号
zerofill使用0填充
mysql> create table t18(
-> id int zerofill
-> );
Query OK, 0 rows affected (0.22 sec)
mysql> insert into t18 values(100);
Query OK, 1 row affected (0.04 sec)
mysql> select * from t18;
------------
| id |
------------
| 0000000100 |
------------
1 row in set (0.00 sec)
删除记录
delete 清空记录,id还是接着清除前的数字
mysql> delete from t18;
Query OK, 1 row affected (0.04 sec)
mysql> select * from t18;
Empty set (0.00 sec)
mysql> desc t18;
------- --------------------------- ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
------- --------------------------- ------ ----- --------- -------
| id | int(10) unsigned zerofill | YES | | NULL | |
------- --------------------------- ------ ----- --------- -------
1 row in set (0.01 sec)
truncate清空多有记录,并且id重置为0
truncate table t20;