MYSQL--存储引擎数据类型约束条件

Posted tulintao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL--存储引擎数据类型约束条件相关的知识,希望对你有一定的参考价值。

存储引擎:

    不同的数据应该有不同的处理机制

    mysql存储引擎

        Innodb:默认的存储引擎  查询速度相比于myisam慢  但是更安全

        myisam:mysql老版本用的存储引擎

        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 INT 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类型,完全可以不指定限时宽度,默认的限时宽度,足够显示完整当初存放的数据

        模糊匹配:

            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个字符  超出就会直接报错  如果少了  有几个就存几个

        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:自动递增

 

delete from :仅仅是删除数据没  不会重置主键

 truncate:初始化表  会重置主键

 

以上是关于MYSQL--存储引擎数据类型约束条件的主要内容,如果未能解决你的问题,请参考以下文章

存储引擎数据类型约束条件

MySQL 存储引擎 字段类型 约束条件

数据库的存储引擎,数据类型,约束条件

存储引擎表的创建字段的各种数据类型模糊匹配严格模式约束条件等

数据库 MySQL 之 表操作存储引擎

mysql 表操作