MySQL基礎回顧
1、資料庫介紹
1.1 什麼是資料庫
資料庫:儲存資料的倉庫。它體現在我們電腦中,就是一個檔案系統。然後把資料都儲存這些特殊的檔案中,並且需要使用固定的語言(SQL語言)去操作檔案中的資料。
技術定義: 資料庫(Database)是按照資料結構來組織、儲存和管理資料的建立在計算機儲存裝置上的倉庫。
1.2 資料庫介紹
我們開發應用程式的時候,程式中的所有資料,最後都需要儲存到專業軟體中。這些專業的儲存資料 的軟體我們稱為資料庫。 我們學習資料庫,並不是學習如何去開發一個數據庫軟體,我們學習的是如何使用資料庫以及資料庫中的資料記錄的操作,而資料庫軟體是由第三方公司研發。
1.3 資料庫的分類
關係型、非關係型的資料庫
常見的資料庫軟體:
Oracle:它是Oracle公司的大型關係型資料庫,它是收費的。
DB2:IBM公司的資料庫,它是收費的。
SqlServer:微軟資料庫。收費
Sybase:Sybase公司的。 工具PowerDesign 資料庫建模工具。
MySql:早期瑞典一個公司發明,後期被sun公司收購,後期被Oracle。
1.4 什麼是關係型資料庫
在開發軟體的時候,軟體中的資料之間必然會有一定的關係存在,需要把這些資料儲存在資料庫中, 同時也要維護資料之間的關係,這時就可以直接使用上述的那些資料庫。而上述的所有資料庫都屬於關係 型資料庫。
描述資料之間的關係,並儲存在資料庫中,同時學習如果根據這些關係查詢資料庫中的資料, 關係型資料:設計資料庫的時候,需要使用E-R圖來描述。實體關係 E-R:實體關係圖。
實體:可以理解成我們Java程式中的一個物件。在E-R圖中使用 矩形(長方形) 表示。
針對一個實體中的屬性,我們稱為這個實體的資料,在E-R圖中使用 橢圓表示。 實體和實體之間的關係:在E-R圖中使用菱形表示。
2、 mysql在linux安裝篇
2.1 centOS7安裝時配置動態ip
#檢視埠 ip a #編輯ifcfg-ens33檔案 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #保證ifcfg-ens33檔案兩個地方正確 BOOTPROTO=dhcp ONBOOT=yes #儲存退出 :wq #重啟網絡卡 systemctl restart network #再檢視ip就分配了ip了 ip a
2.2 centOS7關於防火牆的命令
#檢視防火牆狀態
firewall-cmd --state
#關閉防火牆
systemctl stop firewalld.service
#禁止防火牆開機啟動
systemctl disable firewalld.service
2.3 安裝mysql(5.7)
#建立目錄
mkdir -p /usr/local/mysql
#進入目錄
cd /usr/local/mysql
#安裝mysql,如果安裝8.0版本,把連結改為https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
yum -y install mysql-server
#重啟mysql
service mysqld restart
#找到預設的密碼
grep "password" /var/log/mysqld.log
#登入mysql
mysql -uroot -p
#輸入密碼登入
#設定密碼的驗證強度等級
set global validate_password_policy=LOW;
#設定密碼的長度為6
set global validate_password_length=6;
#修改密碼
set password for root@localhost = password('123456');
#退出,然後重新登入
quit;
mysql -uroot -p
#輸入密碼登入
#修改遠端訪問
use mysql;
update user set host = '%' where user ='root';
quit
service mysqld restart
#開放3306埠
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重新載入防火牆
firewall-cmd --reload
#檢視開放埠
firewall-cmd --zone=public --list-ports
#開放埠成功就可以在外部用navicat直接連線了
3、 mysql基本操作篇
3.1 基本的SQL語句
首先登入mysql,sql語句不區分大小寫
pet.txt的內容:
Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird 1997-12-09
Slim Benny snake m 1996-04-29
-- 查詢mysql當前版本以及當前日期
SELECT VERSION(),CURRENT_DATE;
-- 可以進行簡單運算
SELECT SIN(PI()/2),(4+1)*5;
-- SQL語句是以分號結尾的,sql語句寫了一半,又不想執行可以在語句末尾加上 \c
-- 查看錶結構
DESC 表名;
-- 檢視建立表的語句
show creat table 表名;
-- 表中匯入資料,可以用insert語句,也可以批量匯入
-- 首先要有pet這個表
create database test;
use test;
CREATE TABLE pet (name VARCHAR(20),owner VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE);
-- 建立一個pet.txt檔案放在/usr/local/mysql下,寫入資料,每個欄位中用tab鍵隔開,欄位沒有值的記錄用\N代替;
LOAD DATA LOCAL INFILE '/usr/local/mysql/pet.txt' INTO TABLE pet;
-- 查詢表中的所有資料
SELECT * FROM pet;
-- 刪除表中的所有資料
DELETE FROM pet;
-- 更新表中名字為Bowser的生日
UPDATE pet SET birth='1989-08-31' WHERE name='Bowser';
-- Mysql預設的字串比較也是不分大小寫的,所以Bowser和bowsER是一樣的結果
-- 查詢生日在1998以後的
SELECT * FROM pet WHERE birth>='1998-01-01';
-- 檢索種類是狗並且性別是m的
SELECT * FROM pet WHERE species='dog' AND sex='m';
-- 查詢種類是snake或者bird的
SELECT * FROM pet WHERE species='snake' OR species='bird';
-- 查詢所有dog的姓名和性別
SELECT name,sex FROM pet WHERE species='dog';
--查詢所有寵物的種類,不重複用關鍵字DISTINCT
SELECT DISTINCT species FROM pet;
-- 根據生日降序查詢所有的列
SELECT * FROM pet ORDER BY birth DESC; --升序用關鍵字ASC,但是一般不用因為這是預設的
-- 根據species欄位升序排列,根據birth欄位降序排列
SELECT * FROM pet ORDER BY species ASC,birth DESC; --優先用species排序,species相同的再根據birth排序
-- 查詢當前日期
SELECT CURDATE();
-- 查詢所有寵物出生的年份,去除重複,YEAR()函式是對對應的日期取年,MONTH()是月,DAY()是日;
SELECT DISTINCT YEAR(birth) AS year FROM pet;
--查詢所有birth不是null的寵物的年齡,AS是取別名,TIMESTAMPDIFF()函式是求時間差,IS NOT NULL表示不為null,IS NULL表示是null!
SELECT *,TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet WHERE birth IS NOT NULL;
-- 查詢年齡最小的寵物的出生日期,年齡最小即是生日最大,MAX()函式用來取某列的最大值,MIN()用來取最小值,求某列資料之和用SUM(),查詢記錄數用COUNT(),查詢平均數用AVG()
SELECT MAX(birth) FROM pet;
-- 查詢前3條記錄,如果只有一個引數,那麼就表示從第一條記錄開始查詢幾條記錄
SELECT * FROM pet LIMIT 3;
-- 查第二條到第四條記錄,第一個引數表示從第幾條記錄開始查詢,第一條記錄是0,第二個引數表示查詢幾條記錄
SELECT * FROM pet LIMIT 1,2;
-- 查詢所有寵物的種類,分組查詢
SELECT species FROM pet GROUP BY species;
-- 求一共有多少條記錄
SELECT COUNT(*) AS count FROM pet;
3.2 SQL語言的分類
1、DDL(資料定義語言)
用來定義資料庫的物件,如資料表、檢視、索引等
2、DML(資料操縱語言庫)
在資料庫表中更新,增加和刪除記錄 如 update, insert, delete
3、DCL(資料控制語言)
用於設定使用者許可權和控制事務語句,如grant,revoke,if…else,while,begintransaction
4、DQL(資料查詢語言)
用於查詢資料的語句, select
4、資料庫的備份與恢復
4.1 備份命令
在mysql的安裝目錄的bin目錄下有mysqldump命令,可以完成對資料庫的備份。
語法:mysqldump -u 使用者名稱 -p密碼 資料庫名> 磁碟SQL檔案路徑
由於mysqldump命令不是sql命令,需要在dos視窗下使用。 注意:在備份資料的時候,資料庫不會被刪除。可以手動刪除資料庫。同時在恢復資料的時候,不會 自動的給我們建立資料庫,僅僅只會恢復資料庫中的表和表中的資料 !
如:
mysqldump ‐uroot ‐p123456 test >/root/data/test.sql
4.2 恢復命令
恢復資料庫,需要手動的先建立資料庫: create database heima2;
語法:mysql -u 使用者名稱-p 匯入庫名< 硬碟SQL檔案絕對路徑
如:
# 首先要建立一個test1的資料庫
# 恢復命令
mysql ‐uroot ‐p123456 test1</root/data/pet.sql
5、多表查詢
5.1 笛卡爾積介紹
笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X * Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對的其中一個成員 !
作用:笛卡爾積的資料對程式是沒有意義的,我們需要將笛卡爾積的資料再次進行過濾!
對於多表查詢操作,需要過濾出滿足條件的資料,需要把多個表進行連線,連線之後需要加上過濾的條條件!
5.2 內聯結
內連線:
語法一: select 列名,列名 … from 表名1,表名2 where 表名1.列名 = 表名2.列名;
語法二: select * from 表名1 inner join 表名2 on 條件
5.3 左外聯結
外聯結:左外聯結、右外聯結、全聯結、自聯結。
左外聯結:用左邊表去右邊表中查詢對應記錄,不管是否找到,都將顯示左邊表中全部記錄。 即:雖然右表沒有左表某條記錄對應的資料,也要把他查詢出來。
語法:select * from 表1 left outer join 表2 on 條件
5.4 右外聯結
用右邊表去左邊表查詢對應記錄,不管是否找到,右邊表全部記錄都將顯示。 即:雖然左表沒有右表某條記錄對應的資料,也要把他查詢出來
語法:select * from 表1 right outer join 表2 on 條件;
5.5 全外聯結
左外連線和右外連線的結果合併,但是會去掉重複的記錄。
select * from 表1 full outer join 表2 on 條件
但是mysql資料庫不支援此語法,但是也可以通過其他方法實現該效果(union關鍵字)。
5.6 關聯子查詢
5.6.1 in和exists關鍵詞的用法
關聯子查詢其他的關鍵字使用:
回憶:age=23 or age=24 等價於 age in (23,24)
in 表示條件應該是在多個列值中。
in:使用在where後面,經常表示是一個列表中的資料,只要被查詢的資料在這個列表中存在即可。
not in:表示被查詢的資料不在該列表中即可!
exists表示存在,當子查詢的結果存在就會顯示主查詢中的所有資料!用在where關鍵字後面,當然也有not exits
5.6.2 union和union all的用法
UNION 語句:用於將不同表中相同列中查詢的資料展示出來;(不包括重複資料)
UNION ALL 語句:用於將不同表中相同列中查詢的資料展示出來;(包括重複資料)
5.6.3 case when語句
case when語句結構
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--比如:
SELECT *,CASE
WHEN salary < 5000 THEN "低等收入"
WHEN salary>= 5000 AND salary < 10000 THEN "中等收入"
WHEN salary > 10000 THEN "高等收入"
END AS level,CASE sex
WHEN "female" THEN 1
WHEN "male" THEN 0
END AS flag
FROM employee;
6、MySQL的資料型別
6.1 MySQL支援的資料型別
(1)MySQL支援所有標準SQL數值資料型別。 這些型別包括嚴格數值資料型別(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值資料型別 (FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
BIT資料型別儲存位欄位值,並且支援MyISAM、MEMORY、InnoDB和BDB表。
作為SQL標準的擴充套件,MySQL也支援整數型別TINYINT、MEDIUMINT和BIGINT。
(2)表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每個時間型別有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
(3)字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
CHAR 和 VARCHAR 型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等 方面也不同。在儲存或檢索過程中不進行大小寫轉換。
BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字 符串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於 列值位元組的數值值。
BLOB 是一個二進位制大物件,可以容納可變數量的資料。有 4 種 BLOB 型別:TINYBLOB、BLOB、 MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納儲存範圍不同。
有 4 種 TEXT 型別:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 型別,可存 儲的最大長度不同,可根據實際情況選擇。
6.2 MySQL 5.0 以上的版本:
1、一個漢字佔多少長度與編碼有關: UTF-8:一個漢字=3個位元組 GBK:一個漢字=2個位元組
2、varchar(n) 表示 n 個字元,無論漢字和英文,Mysql 都能存入 n 個字元,僅是實際位元組長度有所區別 3、MySQL 檢查長度,可用 SQL 語言來檢視:
SELECT LENGTH(fieldname) FROM tablename
7、分組語句
GROUP BY 語句根據一個或多個列對結果集進行分組。 在分組的列上我們可以使用 COUNT,SUM,AVG,等函式。
注意:
1、group by 可以實現一個最簡單的去重查詢 ;
2、分組後的條件使用 HAVING 來限定,WHERE 是對原始資料進行條件限制。幾個關鍵字的使用順序為 where 、group by 、having、order by ,例如:
SELECT name,sum(*) FROM employee_tbl WHERE id<>1 GROUP BY name HAVING sum(*)>5 ORDER
BY sum(*) DESC;
8、模糊查詢
LIKE 子句中使用百分號 %字元來表示任意字元,類似於UNIX或正則表示式中的星號 *。 如果沒有使用百分號 %,LIKE 子句與等號 = 的效果是一樣的
你可以在 WHERE 子句中指定任何條件。
你可以在 WHERE 子句中使用LIKE子句。
你可以使用LIKE子句代替等號 。
LIKE 通常與 % 一同使用,類似於一個元字元的搜尋。
你可以使用 AND 或者 OR 指定一個或多個條件。
你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句來指定條件
注意:"%“表示任意個字元(0個或者n個),”_"示有且只有一個字元!
SELECT * FROM pet WHERE species LIKE '%d%'; --表示搜尋pet表中species欄位中含有d的行的所有資訊
9、NULL 值處理
當提供的查詢條 件欄位為 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 運算子
10、 獲取伺服器元資料
命令 描述
SELECT VERSION( ) 伺服器版本資訊
SELECT DATABASE( ) 當前資料庫名 (或者返回空)
SELECT USER( ) 當前使用者名稱
SHOW STATUS 伺服器狀態
SHOW VARIABLES 伺服器配置變數
11、 ALTER命令
11.1 刪除、新增或修改表字段
如下命令使用了 ALTER 命令及 DROP 子句來刪除以上建立表的 i 欄位:
ALTER TABLE testalter_tbl DROP i;
如果資料表中只剩餘一個欄位則無法使用DROP來刪除欄位。
MySQL 中使用 ADD 子句來向資料表中新增列,如下例項在表 testalter_tbl 中新增 i 欄位,並定義資料型別:
ALTER TABLE testalter_tbl ADD i INT;
執行以上命令後,i 欄位會自動新增到資料表字段的末尾 !
11.2 修改欄位型別及名稱
如果需要修改欄位型別及名稱,你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把欄位 c 的型別從 CHAR(1) 改為 CHAR(10),可以執行以下命令:
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
11.3 修改表名
如果需要修改資料表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現。
嘗試以下例項將資料表 testalter_tbl 重新命名為 alter_tbl:
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
12、MySQL內建函式
12.1 關於字串的內建函式
CONCAT(“str1”,“str2”,…) 把所有的字串連線起來組成一個新的字串;
LTRIM(“str”) 去掉字串左邊的所有空格,RTRIM()則是去掉右邊的空格,TRIM()是去掉左右兩邊的空格!
FORMAT(x,n) 將x保留到小數點後n位,四捨五入!
LOWER(“str”) 將字串所有字元轉換為小寫的格式!
REVERSE(“str”) 將字串的順序反過來!
SPACE(n) 返回n個空格!
SUBSTRING(“str”,i,j) 擷取字串,從下標為i的字元開始,擷取j個!
UPPER(“str”) 將字串的所有字元變為大寫的
…
12.2 關於數字的函式
PI() 得到圓周率
RAND() 返回0到1的隨機數
ROUND(x) 返回離x最近的整數
…
12.3 日期型別的函式
CURDATE() 返回當前日期,等同於CURRENT_DATE();
CURRENT_TIME() 返回當前時間
DATEDIFF(d1,d2) 計算日期d1,d2相隔天數
…
12.4 高階函式
DATABASE() 返回當前資料庫名
LAST_INSERT_ID() 返回最近生成的AUTO_INCREMENT值
…
13、MySQL索引
MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不 是組合索引。組合索引,即一個索引包含多個列。
建立索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表儲存了主鍵與索引欄位,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大 提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表 時,MySQL不僅要儲存資料,還要儲存一下索引檔案。 建立索引會佔用磁碟空間的索引檔案。
13.1 普通索引
13.1.1 建立索引
這是最基本的索引,它沒有任何限制。它有以下幾種建立方式 :
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length;
13.1.2 修改表結構,新增索引
ALTER table tableName ADD INDEX indexName(columnName)
13.1.3 建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,username VARCHAR(16) NOT NULL,INDEX [indexName] (username(length))
);
13.1.4 刪除索引的語法
DROP INDEX [indexName] ON mytable;
13.2 唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值 的組合必須唯一。它有以下幾種建立方式:
13.2.1 建立索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
13.2.2 修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
13.2.3 建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,UNIQUE [indexName] (username(length))
);
13.3 使用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 ,用於全文索引
以下例項為在表中新增索引:
ALTER TABLE testalter_tbl ADD INDEX (c);
你還可以在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試以下例項刪除索引:
ALTER TABLE testalter_tbl DROP INDEX c;
13.4 使用 ALTER 命令新增和刪除主鍵
主鍵只能作用於一個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)。例項如下:
ALTER TABLE testalter_tbl MODIFY itcast INT NOT NULL;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (itcast);
你也可以使用 ALTER 命令刪除主鍵:
ALTER TABLE testalter_tbl DROP PRIMARY KEY;
刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。
13.5 顯示索引資訊
你可以使用 SHOW INDEX 命令來列出表中的相關的索引資訊。可以通過新增 \G 來格式化輸出資訊。
SHOW INDEX FROM table_name; \G
14、MySQL事務
MySQL 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除一個人 員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
在 MySQL 中只有使用了Innodb 資料庫引擎的資料庫或表才支援事務。
事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
事務用來管理 insert,update,delete 語句 一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性 (Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,在中間某個環節 不會結束。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務 從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全 符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務並 發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化 (Serializable)。
永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。
14.1 事務控制語句
BEGIN或START TRANSACTION:顯式地開啟一個事務;
COMMIT:也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫 進行的所有修改成為永久性的;
ROLLBACK:有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正 在進行的所有未提交的修改;
SAVEPOINT identifier:SAVEPOINT允許在事務中建立一個儲存點,一個事務中可以有多個 SAVEPOINT;
RELEASE SAVEPOINT identifier:刪除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會拋 出一個異常;
ROLLBACK TO identifier:把事務回滾到標記點;
SET TRANSACTION:用來設定事務的隔離級別。InnoDB儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
14.2 MySQL 事務處理主要有兩種方法
1、用 BEGIN,ROLLBACK,COMMIT來實現
BEGIN 開始一個事務
ROLLBACK 事務回滾
COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
SET AUTOCOMMIT=0 禁止自動提交
SET AUTOCOMMIT=1 開啟自動提交