Python-day(十二)-MySQL

1、數據庫介紹

  什麼是數據庫?

    數據是按照數據結構組織、存儲和管理數據的倉庫
    每一個數據庫都有一個或多個不一樣的API用於建立,訪問,管理,搜索和複製所保存的數據。
    咱們也能夠將數據存儲在文件中,可是在文件中讀寫數據速度相對較慢。
    因此,如今咱們使用關係型數據庫管理系統(RDBMS)來存儲和管理的大數據量,所謂的關係型數據庫,是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。
    RDBMS即關係數據庫的管理系統(Relational Databases Management System)的特色:
        一、數據以表格的形式出現
        二、每行爲各類記錄名稱
        三、每列爲記錄名稱所對應的數據域
        四、許多的行和列組成一張表單。
        五、若干的表單組成database。java

  RDBMS 術語

        在咱們開始學習MySQL數據庫前,讓咱們先了解下RDBMS的一些術語:
            數據庫:數據庫是一些關聯表的集合。
            數據表:表示數據的矩陣,在一個數據庫中的表看起來像一個簡單的電子表格。
            列:一列(數據元素)包含了相同的數據,例如郵政編碼的數據。
            行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
            冗餘:存儲兩倍說句,冗餘可使系統速度更快(表的規範化程度越高,表與表之間的關係就越多;查詢時可能常常須要在多個表之間進行鏈接查詢,而進行鏈接操做會下降查詢速度,例如,學生的信息存儲在student表中,院系信息存儲在department表中,經過student表中的dept_id字段與department表創建關聯關係。若是要查詢一個學生所在系的名稱,必須從student表中查詢學生所在院系的編號(dept_id),而後根據這個編號去department查找系的名稱,若是常常須要進行這個操做時,鏈接查詢會浪費不少的時間,所以能夠在student表中增長一個冗餘字段dept_name,該字段用來存儲學生所在院系的名稱,這樣就不用每次都進行鏈接操做了。)
            主鍵:主鍵是惟一的,一個數據表中只能包含一個主鍵,你可使用主鍵來查詢數據
            外鍵:外鍵用於關聯兩個表。
            複合鍵:複合鍵(組合鍵)將多個列做爲一個索引鍵,通常用於複合索引。
            索引:使用索引可快速訪問數據庫表中的特定信息,索引是對數據庫表中一列或多列的值進行排序的一種結構,相似於書籍的目錄。
            參照完整性:參照的完整性要求關係中不容許引用不存在的實體,與實體完整性是關係模型必須知足的完整性約束條件,目的是保證數據的一致性。mysql

  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系統。           linux

2、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。web

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服務器的密碼爲空,因此本實例不須要輸入密碼。
        
        命令以下:sql

 [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/ 目錄中。

3、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相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。            

 

4、事務

    MySQL事務主要用於處理操做量大,複雜度高的數據,好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如郵箱,文章等,這樣,這些數據庫操做語句就構成一個事務。
    
        在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務。
        事務處理能夠用來維護數據庫的完整性,保證成批的sql語句要麼所有執行,要麼所有不執行。
        事務用來管理insert,update,dalete語句。
    通常來講,事務是必須知足4個條件(ACID):Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
        一、事務的原子性:一組事務,要麼成功,要麼撤回。
        二、穩定性:有非法數據(外鍵約束之類),事務撤回
        三、隔離性:事務獨立運行,一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回,事務的100%隔離,須要犧牲速度。
        四、可靠性:軟、硬件崩潰後,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

 

5、索引

    MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。
    打個比方,若是合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一我的力三輪車
    索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠由多個單列索引,但這不是組合索引,組合索引,即一個索引包含多個列。
    建立索引時,你須要確保該索引是應用在sql查詢語句的條件(通常做爲where子句的條件)
    實際上,索引也是一張表,該表保證了主鍵與索引字段,並指向實體表的記錄。
    上面都在說使用索引的好處,但過多的使用索引將會形成濫用。所以索引也會有它的缺點:雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行insert、update、delete,由於更新表時,MySQL不只要保存數據,還要保存一下索引文件,創建索引會佔用磁盤空間索引文件。
    
    編程

  一、普通索引


 

       建立索引
            這是最基本的索引,它沒有任何限制,他有如下幾種建立方式:
                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;   

  二、惟一索引

        它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值,若是是組合索引,則列值的組合必須惟一,他有如下幾種建立方法:
        
       ruby

建立索引
            建立索引
            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_name\G
            
相關文章
相關標籤/搜索