zoukankan      html  css  js  c++  java
  • 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:初始化表  会重置主键

  • 相关阅读:
    快速排序算法
    excel取值
    5.管理控制文件和日志文件
    贝叶斯决策与参数估计小结
    Kernel Methods (5) Kernel PCA
    Kernel Methods (4) Kernel SVM
    Kernel Methods (3) Kernel Linear Regression
    Kernel Methods (2) Kernel function
    Kernel Methods (1) 从简单的例子开始
    PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?
  • 原文地址:https://www.cnblogs.com/tulintao/p/11380641.html
Copyright © 2011-2022 走看看