MySQL字段类型 约束

时间:2021-09-23 07:59:06

目录

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;