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:初始化表  会重置主键

 

posted @ 2019-08-20 00:12  tulintao  阅读(301)  评论(0编辑  收藏  举报