• Python-day(十二)-MySQL


    一、数据库介绍

      什么是数据库?

        数据是按照数据结构组织、存储和管理数据的仓库
        每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
        我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
        所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量,所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
        RDBMS即关系数据库的管理系统(Relational Databases Management System)的特点:
            1、数据以表格的形式出现
            2、每行为各种记录名称
            3、每列为记录名称所对应的数据域
            4、许多的行和列组成一张表单。
            5、若干的表单组成database。

      RDBMS 术语

            在我们开始学习MySQL数据库前,让我们先了解下RDBMS的一些术语:
                数据库:数据库是一些关联表的集合。
                数据表:表示数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格。
                列:一列(数据元素)包含了相同的数据,例如邮政编码的数据。
                行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
                冗余:存储两倍说句,冗余可以使系统速度更快(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询,而进行连接操作会降低查询速度,例如,学生的信息存储在student表中,院系信息存储在department表中,通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查询学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称,如果经常需要进行这个操作时,连接查询会浪费很多的时间,因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称,这样就不用每次都进行连接操作了。)
                主键:主键是唯一的,一个数据表中只能包含一个主键,你可以使用主键来查询数据
                外键:外键用于关联两个表。
                复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
                索引:使用索引可快速访问数据库表中的特定信息,索引是对数据库表中一列或多列的值进行排序的一种结构,类似于书籍的目录。
                参照完整性:参照的完整性要求关系中不允许引用不存在的实体,与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

      MySQL数据库

            MySQL是最流行的关系型数据库管理系统,在web应用方面MySQL是最好的RDBMS应用软件之一,MySQL是一种关系型数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库中,这样就增加了速度并提高了灵活性。
                MySQL是开源的,所以你不需要支付额外的费用。
                MySQL支持大型的数据库,可以处理拥有上千万条记录的大型数据库。
                MySQL使用标准的SQL数据语言形式。
                MySQL可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、java、perl、PHP、eiffel、ruby和tcl等。
                MySQL对PHP有很好的支持,PHP是目前最流行的web开发语言。
                MySQL支持大型数据库,支持5000万条记录的数据仓库。32位系统表文件最大可支持4GB,64为操作系统最大的表文件为8TB。
                MySQL是可以定制,采用了GPL协议,你可以修改源码来开发自己的MySQL系统。          

    二、MySQL数据的安装使用

    Linux/Unix上安装MySQL

        Linux平台上推荐使用rpm包来安装MySQL,MySQL AB提供了以下RPM包的下载地址。
            MySQL-MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL的服务器。
            MySQL-client MySQL客户端程序,用于连接并操作MySQL服务器。
            mysql-devel-库和包含文件,如果你想要编译其它mysql客户端,例如perl模块,则需要安装该RPM包。
            MySQL-shared-该软件包包含某些语言和应用程序需要动态状态的共享库(libmysqlclient.so*),使用MySQL。
            MySQL-bench-MySQL数据库服务器的基准和性能测试工具。
            
        以下安装MySQL RMP的实例是在SuSE Linux系统上进行,当然该安装步骤也适合应用于其他支持RPM的Linux系统,如:CentOS。

    2.1 MySQL简单操作       

        通过以下命令执行Mysql安装,rpm包为你下载的rpm包:
            
            [root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
            
        以上安装mysql服务器的过程会创建mysql用户,并创建一个mysql配置文件my.cnf。
            
        你可以在/usr/bin和/usr/sbin中找到所有与MySQL相关的二进制文件。所有数据表和数据库将在/var/lib/mysql目录中创建。
            
        以下是一些mysql可选包的安装过程,你可以根据自己的需要来安装:
            [root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
            [root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
            [root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
            [root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm 

      使用 MySQL Client(Mysql客户端) 执行简单的SQL命令

            你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到Mysql服务器上,默认情况下Mysql服务器的密码为空,所以本实例不需要输入密码。
            
            命令如下:

     [root@host]# mysql
    
            以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令:
    
            mysql> SHOW DATABASES;
            +----------+
            | Database |
            +----------+
            | mysql    |
            | test     |
            +----------+
            2 rows in set (0.13 sec)
    
            Mysql安装后需要做的
            
            Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码:
                
            [root@host]# mysqladmin -u root password "new_password";
            
            现在你可以通过以下命令来连接到Mysql服务器:
                
            [root@host]# mysql -u root -p
            Enter password:*******
            
            注意:在输入密码时,密码是不会显示了,你正确输入即可。
            Linux系统启动时启动 MySQL
            
            如果你需要在Linux系统启动时启动 MySQL 服务器,你需要在 /etc/rc.local 文件中添加以下命令:
                
            /etc/init.d/mysqld start
    
            同样,你需要将 mysqld 二进制文件添加到 /etc/init.d/ 目录中。

    三、MySQL管理      

    3.1 启动及关闭MySQL服务器

            首先,我们需要通过以下命令来检查MySQL服务器是否启动:
        
            ps -ef | grep mysqld
            
            如果MySql已经启动,以上命令将输出mysql进程列表, 如果mysql未启动,你可以使用以下命令来启动mysql服务器:
                
            root@host# cd /usr/bin
            ./mysqld_safe &
            
            如果你想关闭目前运行的 MySQL 服务器, 你可以执行以下命令:
                
            root@host# cd /usr/bin
            ./mysqladmin -u root -p shutdown
            Enter password: ******

    3.2 MySQL用户设置

           

    如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。
            
            以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:
            
            root@host# mysql -u root -p
            Enter password:*******
            mysql> use mysql;
            Database changed
             
            mysql> INSERT INTO user
                      (host, user, password,
                       select_priv, insert_priv, update_priv)
                       VALUES ('localhost', 'guest',
                       PASSWORD('guest123'), 'Y', 'Y', 'Y');
            Query OK, 1 row affected (0.20 sec)
             
            mysql> FLUSH PRIVILEGES;
            Query OK, 1 row affected (0.01 sec)
             
            mysql> SELECT host, user, password FROM user WHERE user = 'guest';
            +-----------+---------+------------------+
            | host      | user    | password         |
            +-----------+---------+------------------+
            | localhost | guest | 6f8c114b58f2ce9e |
            +-----------+---------+------------------+
            1 row in set (0.00 sec)
            
            在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。 你可以在以上实例看到用户密码加密后为: 6f8c114b58f2ce9e.
            
            注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。
            
            注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。
            
            如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。
            
            你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:
            
            Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv
            
            另外一种添加用户的方法为通过SQL的 GRANT 命令,你下命令会给指定数据库TUTORIALS添加用户 zara ,密码为 zara123 。
                
            root@host# mysql -u root -p password;
            Enter password:*******
            mysql> use mysql;
            Database changed
             
            mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
                -> ON TUTORIALS.*
                -> TO 'zara'@'localhost'
                -> IDENTIFIED BY 'zara123';

    3.3 管理MySQL的命令

            MySQL数据过程中常用的命令:
                use databasename:选择要操作的MySQL数据库,使用该命令后所有mysql命令都只针对该数据库。
                show databases:查看数据库
                show tables:查看数据表
                show columns from 数据表:显示数据表的属性,属性类型,主键信息,是否为null,默认值等其他信息。
                create database testdb charset "utf8":创建数据库
                drop database testdb,删除数据库。
                show index from 数据表:显示数据表的详细索引信息,包括主键(primary key)
                grant :用户授权
                flush privileges:刷新权限。

    3.4 MySQL数据类型

            MySQL中定义数据字段的类型对你数据库的优化是非常重要。
            MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
            
            数值类型
                MySQL支持所有标准sql数值数据类型。
                这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
                关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
                BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
                作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。          

    3.5 mysql常用命令

      MySQL创建数据表

                语法
                    CREATE TABLE table_name (column_name column_type);
                创建一个student表
                mysql> create table student(
                    -> id int not null auto_increment,
                    -> name char(32) not null,
                    -> age int not null,
                    -> register_date date,
                    -> primary key (id)
                    -> );
                实例解析:
                    如果你不想字段NULL可以设置字段的属性为NOT NUll,在操作数据库时如果输入该字段的数据为NUll,就会报错。
                    AUTO_INCREMENT自定义列为自增的属性,一般用于主键,数值会自动加1.
                    PRIMARY KEY 关键字用于定义列为主键,你可以使用多列来定义主键,列间以逗号分隔。
                       

      MySQL插入数据

                语法:
                    INSERT INTO table_name ( field1, field2,...fieldN )
                                            VALUES
                                            ( value1, value2,...valueN );
                插入数据
                    insert into student (name,age,register_date) values ("陈鑫",22,"2016-02-03");
                    mysql> select * from student;
                    +----+--------+-----+---------------+
                    | id | name   | age | register_date |
                    +----+--------+-----+---------------+
                    |  1 | 陈鑫 |  22 | 2016-02-03    |
                    +----+--------+-----+---------------+
                    1 row in set (0.00 sec)      

      MySQL查询数据

                语法: SELECT column_name,column_name
                        FROM table_name
                        [WHERE Clause]
                        [OFFSET M ][LIMIT N]
                    查询语句中你可以时候用一个或多个表,表之间使用逗号(,)分割,并使用where语句来设定查询条件。
                    select 命令可以读取一条或多条记录。
                    你可以使用星号(*)来代替其他字段,select语句会返回表的所有字段数据。
                    你可以通过offset指定select语句开始查询的数据偏移量,默认情况下偏移量为0.
                    你可以使用limit属性来设定返回的记录数。
                查询数据
                    mysql> select * from student limit 3 offset 2;
                    +----+-----------+-----+---------------+
                    | id | name      | age | register_date |
                    +----+-----------+-----+---------------+
                    |  3 | 刘强    |  53 | 2016-04-30    |
                    |  4 | 白弘毅 |  31 | 2016-11-21    |
                    |  5 | 汤中山 |  21 | 2016-12-20    |
                    +----+-----------+-----+---------------+
                    3 rows in set (0.00 sec)
                    #从第二行开始向下查询3条数据,limit后面跟的是3条数据,offset后面是从第2行开始读取。
                    mysql> select * from student limit 3,1;
                    +----+-----------+-----+---------------+
                    | id | name      | age | register_date |
                    +----+-----------+-----+---------------+
                    |  4 | 白弘毅 |  31 | 2016-11-21    |
                    +----+-----------+-----+---------------+
                    1 row in set (0.00 sec)
                    #这个sql是,limit后面是从第3条开始读,读取1条信息。  

      MySQL where 子句

                语法:
                    SELECT field1, field2,...fieldN FROM table_name1, table_name2...
                    [WHERE condition1 [AND [OR]] condition2.....
                以下为操作符列表,可用于where子句中
                    下表中实例假定 A为10 B为20
                    操作符          描述                                                                                                实例
                    =               等号,检测两个值是否相等,如果相等返回true                                                                (A = B) 返回false。
                  <>,!=           不等于,检测两个值是否相等,如果不相等返回true                                                             (A != B) 返回 true。
                    >               大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true                                      (A > B) 返回false。
                    <               小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true                                      (A < B) 返回 true。
                    >=              大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true                            (A >= B) 返回false。
                   <=              小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true                          (A <= B) 返回 true。
            
                
                使用主键来作为 where 子句的条件查询是非常快速的。
                mysql> select * from student where register_date >"2016-08-31";    

      MySQL update 语句

                语法:
                    UPDATE table_name SET field1=new-value1, field2=new-value2
                    [WHERE Clause]
                
                     update student set age=22,name=="chenxin" where id =1;                 

      MySQL delete语句          

    语法:
                    DELETE FROM table_name [WHERE Clause]
                    
                    delete from student where id=5;       

      MySQL like 子句

               

    语法:
                    SELECT field1, field2,...fieldN table_name1, table_name2...
                    WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
                    
                    select * from student where name like "%Li";#不区分大小写匹配
                    select * from student where name like binary "%li";#区分大小写匹配                     

      MySQL排序

               

    语法:
                    SELECT field1, field2,...fieldN table_name1, table_name2...
                    ORDER BY field1, [field2...] [ASC [DESC]]
                  使用ASC或DESC关键字来设置查询结果是按升序或降序排列,默认情况下,它是按升序排序。
                    
                    select * from student where name like binary "%li" order by id desc; #desc是降序排序,按照id进行排序
                    select * from student where name like "%li" order by id;#默认按照升序排序。         

      MySQL group by 语句

                SELECT column_name, function(column_name)
                FROM table_name
                WHERE column_name operator value
                GROUP BY column_name;
                    
                mysql> select * from student;
                +----+-----------+-----+---------------+
                | id | name      | age | register_date |
                +----+-----------+-----+---------------+
                |  1 | chenxin   |  22 | 2016-02-03    |
                |  2 | 沁夫    |  33 | 2016-06-08    |
                |  3 | 刘强    |  53 | 2016-04-30    |
                |  4 | 白弘毅 |  31 | 2016-11-21    |
                |  6 | alex li   |  18 | 2016-11-11    |
                |  7 | alex Li   |  33 | 2015-11-11    |
                +----+-----------+-----+---------------+
                6 rows in set (0.01 sec)
                 接下来我们使用 group by 语句,将数据表按名字进行分组,并统计每个人有多少条记录;
                 mysql> select name,count(*) from student group by name;
                +-----------+----------+
                | name      | count(*) |
                +-----------+----------+
                | alex li   |        2 |
                | chenxin   |        1 |
                | 白弘毅 |        1 |
                | 刘强    |        1 |
                | 沁夫    |        1 |
                +-----------+----------+
                5 rows in set (0.00 sec)
                使用with rollup,#将相同name的条数的年龄相加起来,在求和。
                mysql> select name,sum(age)as age_count from student group by name with rollup;
                +-----------+-----------+
                | name      | age_count |
                +-----------+-----------+
                | alex li   |        51 |
                | chenxin   |        22 |
                | 白弘毅 |        31 |
                | 刘强    |        53 |
                | 沁夫    |        33 |
                | NULL      |       190 |
                +-----------+-----------+
                6 rows in set (0.00 sec)
                其中记录NULL表示所有人的年龄之和。
                我们是使用coalesce来设置一个取代null的名称,coalesce语法:
                mysql> select coalesce(name,'总数'),sum(age) as age_count from student group by name with rollup;
                +-------------------------+-----------+
                | coalesce(name,'总数') | age_count |
                +-------------------------+-----------+
                | alex li                 |        51 |
                | chenxin                 |        22 |
                | 白弘毅               |        31 |
                | 刘强                  |        53 |
                | 沁夫                  |        33 |
                | 总数                  |       190 |
                +-------------------------+-----------+
                6 rows in set (0.00 sec)
                

      MySQL alter 命令       

               

    我们需要修改数据库表名或者修改数据表字段时,就需要使用到MySQL alter命令。
                删除,添加或修改表字段
                    alter table student drop register_date; #从student表删除register_date字段。
                    alter table student add phone int(11) not null; #在student表中添加phone字段。
                修改字段类型及名称
                    如果需要修改字段类型及名称,你可以在alter命令中使用modify或change子句。
                    
                    例如,把字段name的类型从char(32)改为char(40),命令为:
                        alter table student modify name char(40);
                    使用change子句,语法有很大不一样,在change关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型,尝试如下实例。
                        alter table student change phone iphone bigint;#修改名字并改变字段类型
                        alter table student change iphone iphone int;#只修改字段类型,但必须要加修改的名字和修改成的名字。
                alter table 对NUll值和默认值的影响
                    当你修改字段时,你可以指定是否包含只或者是否设置默认值。
                    以下实例,指定字段iphone为not null 且默认值为100
                     alter table student modify iphone bigint not null default 100;
                     #注意:这里修改的默认值是在此以后新添加的会有默认值,之前的数据是不会修改的。
                修改表名
                    alter table student rename to alter_tb1;

      MySQL关于主键

            

       外键,一个特殊的索引,用于关键2个表,只能是指定的内容。
                mysql> create table class(
                    -> id int not null primary key,
                    -> name char(16));
                Query OK, 0 rows affected (0.00 sec)
                
                mysql> create table student2(
                    -> id int not null,
                    -> name char(16) not null,
                    -> class_id int not null,
                    -> primary key (id),
                    -> key fk_class_key (class_id),
                    -> constraint fk_class_key foreign key (class_id) references class (id)
                    -> );
                Query OK, 0 rows affected (0.00 sec)
                此时如果class表中不存在id 1,student表也插入不了,这就叫外键约束。
                mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
                ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
                 
                 
                 
                mysql> insert into class(id,name) values(1,"linux");
                Query OK, 1 row affected (0.01 sec)
                 
                mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
                Query OK, 1 row affected (0.00 sec)
                 
                 
                #如果有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的
                mysql> delete from class where id =1;
                ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))     

      MySQL NUll 值处理

      我们已经知道MySQL使用sql select命令及where子句来读取数据表中的数据,但是当提供的查询条件字段为NUll时,该命令可能就无法正常工作。
                为了处理这种情况,MySQL提供了三大运算符:
                    is null:当列的值是null,此运算符返回true。
                    is not null:当列的值不为null,运算符返回true。
                    <=>:比较操作符(不同于=运算符),当比较的两个值为null时返回true。
                    关于null的条件比较运算是比较特殊的,你不能使用=null或!=null在列中查找null值。
                    在mysql中,null值与任何其它值的比较(即使是null)永远返回false,即null=null返回false。
                    MySQL中处理null使用is null和is not null运算符。                

      MySQL 连接(left join ,right join,inner join,full join)

               

    我们已经学会了如果在一张表中读取数据,这是相对简单的,但是真正的应用中经常需要从多张数据表中读取数据。
                本章节我们将向大家介绍如何使用MySQL和join在两个或多个表中查询数据。
                你可以在select ,update,和delete语句中使用MySQL的join来联合多表查询。
                join按照功能大致分为如下 三类:
                    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
                    LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
                    RIGHT JOIN(右连接):与LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录。            

    四、事务

        MySQL事务主要用于处理操作量大,复杂度高的数据,比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如邮箱,文章等,这样,这些数据库操作语句就构成一个事务。
        
            在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
            事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。
            事务用来管理insert,update,dalete语句。
        一般来说,事务是必须满足4个条件(ACID):Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
            1、事务的原子性:一组事务,要么成功,要么撤回。
            2、稳定性:有非法数据(外键约束之类),事务撤回
            3、隔离性:事务独立运行,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回,事务的100%隔离,需要牺牲速度。
            4、可靠性:软、硬件崩溃后,Innodb数据表驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项,决定什么时候把事务保存到日志里。

      在MySQL控制台使用事务操作


          

     完成一个事务
                mysql> begin;
                Query OK, 0 rows affected (0.00 sec)
                
                mysql> select * from A;
                Empty set (0.00 sec)
                
                mysql> insert into A (id) values(1);
                Query OK, 1 row affected (0.00 sec)
                
                mysql> select * from A;
                +----+
                | id |
                +----+
                |  1 |
                +----+
                1 row in set (0.00 sec)
                
                mysql> commit;
                Query OK, 0 rows affected (0.00 sec)
            回滚一个事务
                mysql> begin;
                Query OK, 0 rows affected (0.00 sec)
                
                mysql> select * from A;
                +----+
                | id |
                +----+
                |  1 |
                +----+
                1 row in set (0.00 sec)
                
                mysql> insert into A(id)values(2);
                Query OK, 1 row affected (0.00 sec)
                
                mysql> rollback;
                Query OK, 0 rows affected (0.00 sec)
                
                mysql> select * from A;
                +----+
                | id |
                +----+
                |  1 |
                +----+
                1 row in set (0.00 sec)
            备注:
                如果发现不能回滚,处理如下:
                    1、首先查看数据的存储引擎
                        mysql> show engines;
                        +------------+---------+------------------------------------------------------------+--------------+------+------------+
                        | Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
                        +------------+---------+------------------------------------------------------------+--------------+------+------------+
                        | MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
                        | CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
                        | MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
                        | InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
                        | MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
                        +------------+---------+------------------------------------------------------------+--------------+------+------------+
                        5 rows in set (0.00 sec)
                    2、查看表使用的存储引擎
                        (1) show table status from db_name where name="table_name";
                        (2) show create table table_name;
                    3、修改表引擎方法
                        altar table table_name engine=innodb;
                    4、永久生效,修改配置文件
                        default-storage-engine=INNODB

    五、索引

        MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
        打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车
        索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以由多个单列索引,但这不是组合索引,组合索引,即一个索引包含多个列。
        创建索引时,你需要确保该索引是应用在sql查询语句的条件(一般作为where子句的条件)
        实际上,索引也是一张表,该表保证了主键与索引字段,并指向实体表的记录。
        上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,建立索引会占用磁盘空间索引文件。
        
       

      1、普通索引


     

           创建索引
                这是最基本的索引,它没有任何限制,他有以下几种创建方式:
                    mysql> create index index_name on student(name);
                    mysql> desc student;
                    +--------+------------+------+-----+---------+----------------+
                    | Field  | Type       | Null | Key | Default | Extra          |
                    +--------+------------+------+-----+---------+----------------+
                    | id     | int(11)    | NO   | PRI | NULL    | auto_increment |
                    | name   | char(40)   | YES  | MUL | NULL    |                |
                    | age    | int(11)    | NO   |     | NULL    |                |
                    | iphone | bigint(20) | NO   |     | 100     |                |
                    +--------+------------+------+-----+---------+----------------+
                    4 rows in set (0.00 sec)
                如果是char、varchar类型,length可以小于字段实际长度,如果是blog和text类型,必须制定length(长度)。
            修改表结构
                ALTER mytable ADD INDEX [indexName] ON (username(length))
            创建表的时候直接指定
                CREATE TABLE mytable(
     
                ID INT NOT NULL,  
                  
                username VARCHAR(16) NOT NULL,
                  
                INDEX [indexName] (username(length))
                  
                );  
            删除索引的语法
                DROP INDEX [indexName] ON mytable;   

      2、唯一索引

            它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一,他有以下几种创建方法:
            
           

    创建索引
                创建索引
                CREATE UNIQUE INDEX indexName ON mytable(username(length))
                 
                 
                修改表结构
                ALTER mytable ADD UNIQUE [indexName] ON (username(length))
                 
                 
                创建表的时候直接指定
                CREATE TABLE mytable(
                  
                ID INT NOT NULL,  
                  
                username VARCHAR(16) NOT NULL,
                  
                UNIQUE [indexName] (username(length))
                  
                );  

           

      使用alter命令添加和删除索引

                有四种方式来添加数据表的索引:
                ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
                ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
                ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
                ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
                 
                 
                以下实例为在表中添加索引。
                mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
                你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
                mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
            使用alter命令添加和删除主键
                主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
                mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
                mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
                 
                你也可以使用 ALTER 命令删除主键:
                mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
                删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
            显示索引信息
                SHOW INDEX FROM table_nameG
                
  • 相关阅读:
    版本管理系统:svn和git
    Java学习笔记七 常用API对象三
    Java学习笔记六 常用API对象二
    Java学习笔记五 常用API对象一
    Java学习笔记三.3
    Java学习笔记三.2
    Java学习笔记三
    析构函数总结
    C++之类的构造函数,不得不学明白的重点
    C++拷贝构造函数(深拷贝,浅拷贝)
  • 原文地址:https://www.cnblogs.com/cxcx/p/6265553.html
Copyright © 2020-2023  润新知