?? ?1、快速創建表
?? ?原理:
?? ??? ?將一個查詢結果當做一張表新建
?? ??? ?這個可以完成表的快速復制
?? ?create table emp2 as select * from emp;
?? ?mysql> select * from emp2;
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| EMPNO | ENAME ?| JOB ? ? ? | MGR ?| HIREDATE ? | SAL ? ? | COMM ? ?| DEPTNO |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| ?7369 | SMITH ?| CLERK ? ? | 7902 | 1980-12-17 | ?800.00 | ? ?NULL | ? ? 20 |
?? ?| ?7499 | ALLEN ?| SALESMAN ?| 7698 | 1981-02-20 | 1600.00 | ?300.00 | ? ? 30 |
?? ?| ?7521 | WARD ? | SALESMAN ?| 7698 | 1981-02-22 | 1250.00 | ?500.00 | ? ? 30 |
?? ?| ?7566 | JONES ?| MANAGER ? | 7839 | 1981-04-02 | 2975.00 | ? ?NULL | ? ? 20 |
?? ?| ?7654 | MARTIN | SALESMAN ?| 7698 | 1981-09-28 | 1250.00 | 1400.00 | ? ? 30 |
?? ?| ?7698 | BLAKE ?| MANAGER ? | 7839 | 1981-05-01 | 2850.00 | ? ?NULL | ? ? 30 |
?? ?| ?7782 | CLARK ?| MANAGER ? | 7839 | 1981-06-09 | 2450.00 | ? ?NULL | ? ? 10 |
?? ?| ?7788 | SCOTT ?| ANALYST ? | 7566 | 1987-04-19 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7839 | KING ? | PRESIDENT | NULL | 1981-11-17 | 5000.00 | ? ?NULL | ? ? 10 |
?? ?| ?7844 | TURNER | SALESMAN ?| 7698 | 1981-09-08 | 1500.00 | ? ?0.00 | ? ? 30 |
?? ?| ?7876 | ADAMS ?| CLERK ? ? | 7788 | 1987-05-23 | 1100.00 | ? ?NULL | ? ? 20 |
?? ?| ?7900 | JAMES ?| CLERK ? ? | 7698 | 1981-12-03 | ?950.00 | ? ?NULL | ? ? 30 |
?? ?| ?7902 | FORD ? | ANALYST ? | 7566 | 1981-12-03 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7934 | MILLER | CLERK ? ? | 7782 | 1982-01-23 | 1300.00 | ? ?NULL | ? ? 10 |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
2、將查詢結果插入到一張表當中?insert相關的
?? ?//將查詢結果創建成表
?? ?creat table dept_bak as select * from dept;
?? ?//將查詢結果插入到表
?? ?insert into dept_bak select * from dept;
3、快速刪除表中的數據?【重要】 truncate
?? ?//刪除dept_bak表中的數據
?? ?delete from dept_bak;
?? ?delete語句刪除數據的原理?(delete屬于DML語句)
?? ??? ?表中的數據被刪除了,但是這個數據在硬盤上的真實存儲空間不會被釋放
?? ??? ?這種刪除的缺點是:刪除效率比較低
?? ??? ?這種刪除的優點是:支持回滾,后悔了可以在恢復數據
?? ?truncate語句刪除數據的原理?
?? ??? ?這種刪除效率比較高,表被一次截斷,物理刪除
?? ??? ?這種刪除缺點:不支持回滾
?? ??? ?這種刪除優點:快速
?? ?
?? ?用法:truncate table dept_bak
?? ?刪除表操作?
?? ?drop table 表名;//這不是刪除表中的數據,這是把表刪除
4、約束(重要)
4.1、什么是約束?
?? ?約束對應的英語單詞:constraint
?? ?在創建表的時候,我們可以給表中的字段加上一些約束,來保證這個表中數據的完整性、有效性
?? ?約束的作用就是為了保證:表中的數據有效
4.2、約束包括哪些?
?? ?非空約束:not null
?? ?唯一約束:nuique
?? ?主鍵約束:primary key
?? ?外鍵約束:foreign key
?? ?檢查約束:check(mysql不支持,oracle支持)
4.3、非空約束:not null
?? ?非空約束not null約束的字段不能為null
?? ?create table t_vip(
?? ?id int,
?? ?name varchar(255) not null
?? ?);
?? ? insert into t_vip values(01,'zhangsan');
?? ? insert into t_vip values(02,'lisi');
?? ? insert into t_vip(id) values(3); //報錯
?? ? Field 'name' doesn't have a default value
?? ? 小插曲:
?? ??? ?xxx.sql這種文件被稱為sql腳本文件
?? ??? ?sql腳本文件中編寫了大量的sql語句
?? ??? ?我們執行sql腳本文件的時候,該文件中所有的sql語句會全部執行
?? ??? ?批量的執行sql語句,可以使用sql腳本文件
?? ??? ?在mysql中怎么執行sql腳本呢?
?? ??? ??? ?source 文件拖過來 但一定注意不能有中文
4.4、唯一性約束:unique
?? ?唯一性約束unique約束的字段不能重復,但是可以為null
?? ?drop table if exists t_vip;
?? ?create table t_vip(
?? ??? ?id int,
?? ??? ?name varchar(255) unique, ?//unique 添加在列的后面時,這種約束被稱為列級約束
?? ??? ?email varchar(255)
?? ?);
?? ?insert into t_vip values(1,'zhangsan','zhangsan@123.com');
?? ?insert into t_vip values(2,'lisi','lisi@123.com');
?? ?insert into t_vip values(3,'wangwu','wangwu@123.com');
?? ?insert into t_vip values(4,'wangwu','wangwu@123.com');
?? ?ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'
?? ?//unique不能重復 但是可以為null
?? ?insert into t_vip(id) values(4);
?? ?mysql> select * from t_vip;
?? ?+------+----------+------------------+
?? ?| id ? | name ? ? | email ? ? ? ? ? ?|
?? ?+------+----------+------------------+
?? ?| ? ?1 | zhangsan | zhangsan@123.com |
?? ?| ? ?2 | lisi ? ? | lisi@123.com ? ? |
?? ?| ? ?3 | wangwu ? | wangwu@123.com ? |
?? ?| ? ?4 | NULL ? ? | NULL ? ? ? ? ? ? |
?? ?+------+----------+------------------+
?? ?新需求:name和email兩個字段聯合起來具有唯一性!!!
?? ?意思是 只有name和email不同時相等 就可以插入進去數據
?? ?drop table if exists t_vip;
?? ?create table t_vip(
?? ??? ?id int,
?? ??? ?name varchar(255),
?? ??? ?email varchar(255),
?? ??? ?unique(name,email)?? ?沒有添加到列的后面,這種約束被稱為表級約束
?? ?);
?? ?insert into t_vip values(1,'zhangsan','zhangsan@123.com');
?? ?insert into t_vip values(2,'zhangsan','zhangsan@qq.com');
?? ?//ERROR 1062 (23000): Duplicate entry 'zhangsan-zhangsan@qq.com' for key 'name'
?? ?insert into t_vip values(3,'zhangsan','zhangsan@123.com');
?? ?什么時候使用表級約束呢?
?? ??? ?需要給多個字段聯合起來添加某一個約束的時候,需要使用表級約束
?? ?unique可以和not null 聯合嗎
?? ? drop table if exists t_vip;
?? ? create table t_vip(id int,name varchar(255) not null unique);
?? ? mysql> desc t_vip;
?? ?+-------+--------------+------+-----+---------+-------+
?? ?| Field | Type ? ? ? ? | Null | Key | Default | Extra |
?? ?+-------+--------------+------+-----+---------+-------+
?? ?| id ? ?| int(11) ? ? ?| YES ?| ? ? | NULL ? ?| ? ? ? |
?? ?| name ?| varchar(255) | NO ? | PRI | NULL ? ?| ? ? ? |
?? ?+-------+--------------+------+-----+---------+-------+
?? ?
?? ?在mysql當中,如果一個字段同時被not null 和unique約束的話,該字段自動編程主鍵字段
?? ?(注意:oracle中不一樣 )
4.5、主鍵約束(primary key,簡稱PK)非常重要
?? ?主鍵約束的相關屬于?
?? ??? ?主鍵約束:就是一種約束
?? ??? ?主鍵字段:該字段上添加了主鍵約束,這樣的字段就叫做主鍵字段
?? ??? ?主鍵值:主鍵字段中的每一個值都叫做:主鍵值
?? ?什么是主鍵?有什么用
?? ??? ?主鍵值是每一行記錄的唯一標識
?? ??? ?主鍵值是每一行記錄的身份證號
?? ?記住:任何一張表都應該有主鍵,沒有主鍵,表無效
?? ?主鍵的特征:not null + unique(主鍵值不能是null,同時也不能重復)
?? ?怎么給字段設置主鍵呢?
?? ??? ?drop table if exists t_vip;
?? ??? ?create table t_vip(
?? ??? ??? ?id int primary key,
?? ??? ??? ?name varchar(255)
?? ??? ?);
?? ??? ?insert into t_vip(id,name) values(1,'zhangsan');
?? ??? ?insert into t_vip(id,name) values(2,'zhangsan');
?? ??? ?//報錯
?? ??? ?insert into t_vip(id,name) values(2,'zhangsan');
?? ??? ?ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
?? ??? ?使用表及約束添加主鍵可以嗎?
?? ??? ?drop table if exists t_vip;
?? ??? ?create table t_vip(
?? ??? ??? ?id int ,
?? ??? ??? ?name varchar(255),
?? ??? ??? ?primary key(id,name)
?? ??? ?);
?? ??? ?insert into t_vip(id,name) values(1,'zhangsan');
?? ??? ?insert into t_vip(id,name) values(2,'zhangsan');
?? ??? ?insert into t_vip(id,name) values(2,'lisi');
?? ??? ?insert into t_vip(id) values(2);
?? ?在實際開發中不建議使用:符合主鍵。建議使用單一主鍵
?? ?復合主鍵比較復雜,不建議使用
?? ?一個表中主鍵只能有一個,不能出現多個
?? ?主鍵除了:單一主鍵和復合主鍵之外,還額可以這樣進行分類?
?? ??? ?自然主鍵:主鍵值是一個自然數,和業務沒關系
?? ??? ?業務主鍵:主鍵值和業務緊密關聯,例如拿銀行卡賬號做主鍵值,這就是業務主鍵
?? ?在實際開發中使用業務主鍵比較多,還是使用自然主鍵多一些呢?
?? ??? ?自然主鍵使用比較好,因為主鍵只要做到不重復就行,不需要有意義
?? ??? ?業務主鍵不好,因為主鍵一旦和業務掛鉤,那么當業務發生變動的時候,可能會影響到主鍵值,所以業務
?? ??? ?主鍵不建議使用。盡量使用自然主鍵
?? ?在mysql中有一種機制,可以幫助我們自動維護一個主鍵值?
?? ??? ?drop table if exists t_vip;
?? ??? ?create table t_vip(
?? ??? ??? ?id int primary key auto_increment,
?? ??? ??? ?name varchar(255)
?? ??? ?);
?? ??? ?insert into t_vip(name) values('zhangsan');
?? ??? ?insert into t_vip(name) values('zhangsan');
?? ??? ?insert into t_vip(name) values('zhangsan');
?? ??? ?insert into t_vip(name) values('zhangsan');
?? ??? ?+----+----------+
?? ??? ?| id | name ? ? |
?? ??? ?+----+----------+
?? ??? ?| ?1 | zhangsan |
?? ??? ?| ?2 | zhangsan |
?? ??? ?| ?3 | zhangsan |
?? ??? ?| ?4 | zhangsan |
?? ??? ?+----+----------+
4.5、外鍵約束
?? ?
?? ?* 關于外鍵約束的相關術語:
?? ??? ?外鍵約束: foreign key
?? ??? ?外鍵字段:添加有外鍵約束的字段
?? ??? ?外鍵值:外鍵字段中的每一個值。
?? ?
?? ?* 業務背景:
?? ??? ?請設計數據庫表,用來維護學生和班級的信息?
?? ??? ??? ?第一種方案:一張表存儲所有數據
?? ??? ??? ?no(pk)?? ??? ??? ?name?? ??? ??? ?classno?? ??? ??? ?classname
?? ??? ??? ?-------------------------------------------------------------------------------------------
?? ??? ??? ?1?? ??? ??? ??? ??? ?zs1?? ??? ??? ??? ?101?? ??? ??? ??? ?北京大興區經濟技術開發區亦莊二中高三1班
?? ??? ??? ?2?? ??? ??? ??? ??? ?zs2?? ??? ??? ??? ?101?? ??? ??? ??? ?北京大興區經濟技術開發區亦莊二中高三1班
?? ??? ??? ?3?? ??? ??? ??? ??? ?zs3?? ??? ??? ??? ?102?? ??? ??? ??? ?北京大興區經濟技術開發區亦莊二中高三2班
?? ??? ??? ?4?? ??? ??? ??? ??? ?zs4?? ??? ??? ??? ?102?? ??? ??? ??? ?北京大興區經濟技術開發區亦莊二中高三2班
?? ??? ??? ?5?? ??? ??? ??? ??? ?zs5?? ??? ??? ??? ?102?? ??? ??? ??? ?北京大興區經濟技術開發區亦莊二中高三2班
?? ??? ??? ?缺點:冗余。【不推薦】
?? ??? ??? ?第二種方案:兩張表(班級表和學生表)
?? ??? ??? ?t_class 班級表
?? ??? ??? ?cno(pk)?? ??? ?cname
?? ??? ??? ?--------------------------------------------------------
?? ??? ??? ?101?? ??? ?北京大興區經濟技術開發區亦莊二中高三1班
?? ??? ??? ?102?? ??? ?北京大興區經濟技術開發區亦莊二中高三2班
?? ??? ??? ?t_student 學生表
?? ??? ??? ?sno(pk)?? ??? ?sname?? ??? ??? ??? ?classno(該字段添加外鍵約束fk)
?? ??? ??? ?------------------------------------------------------------
?? ??? ??? ?1?? ??? ??? ??? ?zs1?? ??? ??? ??? ?101
?? ??? ??? ?2?? ??? ??? ??? ?zs2?? ??? ??? ??? ?101
?? ??? ??? ?3?? ??? ??? ??? ?zs3?? ??? ??? ??? ?102
?? ??? ??? ?4?? ??? ??? ??? ?zs4?? ??? ??? ??? ?102
?? ??? ??? ?5?? ??? ??? ??? ?zs5?? ??? ??? ??? ?102
?? ??? ?
?? ?* 將以上表的建表語句寫出來:
?? ??? ?t_student中的classno字段引用t_class表中的cno字段,此時t_student表叫做子表。t_class表叫做父表。
?? ??? ?順序要求:
?? ??? ??? ?刪除數據的時候,先刪除子表,再刪除父表。
?? ??? ??? ?添加數據的時候,先添加父表,在添加子表。
?? ??? ??? ?創建表的時候,先創建父表,再創建子表。
?? ??? ??? ?刪除表的時候,先刪除子表,在刪除父表。
?? ??? ?
?? ??? ?drop table if exists t_student;
?? ??? ?drop table if exists t_class;
?? ??? ?create table t_class(
?? ??? ??? ?cno int,
?? ??? ??? ?cname varchar(255),
?? ??? ??? ?primary key(cno)
?? ??? ?);
?? ??? ?create table t_student(
?? ??? ??? ?sno int,
?? ??? ??? ?sname varchar(255),
?? ??? ??? ?classno int,
?? ??? ??? ?primary key(sno),
?? ??? ??? ?foreign key(classno) references t_class(cno)
?? ??? ?);
?? ??? ?insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
?? ??? ?insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');
?? ??? ?insert into t_student values(1,'zs1',101);
?? ??? ?insert into t_student values(2,'zs2',101);
?? ??? ?insert into t_student values(3,'zs3',102);
?? ??? ?insert into t_student values(4,'zs4',102);
?? ??? ?insert into t_student values(5,'zs5',102);
?? ??? ?insert into t_student values(6,'zs6',102);
?? ??? ?select * from t_class;
?? ??? ?select * from t_student;
?? ??? ?insert into t_student values(7,'lisi',103);
?? ??? ?ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bjpowernode`.INT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
?? ?* 外鍵值可以為NULL?
?? ??? ?外鍵可以為NULL。
?? ?
?? ?* 外鍵字段引用其他表的某個字段的時候,被引用的字段必須是主鍵嗎?
?? ??? ?注意:被引用的字段不一定是主鍵,但至少具有unique約束。
5、存儲引擎(了解)
5.1、什么是存儲引擎,有什么用呢?
?? ?存儲引擎是mysql中特有的一個術語,其他數據庫中沒有。(Oracle中有,但是不叫這個名字)
?? ?實際上存儲引擎是一個表存儲/組織數據的方式。
?? ?不同的存儲引擎,表存儲數據的方式不同
?? ?使用:show create table 表名; ?
?? ?來查看表的存儲引擎
?? ?| t_vip | CREATE TABLE `t_vip` (
?? ? ?`id` int(11) NOT NULL AUTO_INCREMENT,
?? ? ?`name` varchar(255) DEFAULT NULL,
?? ? ?PRIMARY KEY (`id`)
?? ?) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
?? ?在創建表的時候 我們可以在最后面的小括號輸入:
?? ?engine = InnoDB default charset = utf8;
?? ?engine是來指定存儲引擎
?? ?charset來指定這張表的字符編碼方式
?? ?結論:
?? ??? ?mysql默認的存儲引擎是InnoDB
?? ??? ?mysql默認的字符編碼方式是:utf8
5.2、怎么查看mysql支持哪些存儲引擎呢?
?? ?show engines \G
?? ?*************************** 1. row ***************************
? ? ? Engine: FEDERATED
? ? ?Support: NO
? ? ?Comment: Federated MySQL storage engine
?? ?Transactions: NULL
?? ??? ? ?XA: NULL
?? ? ?Savepoints: NULL
?? ?*************************** 2. row ***************************
?? ? ? ? ?Engine: MRG_MYISAM
?? ? ? ? Support: YES
?? ? ? ? Comment: Collection of identical MyISAM tables
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
?? ?*************************** 3. row ***************************
?? ? ? ? ?Engine: MyISAM
?? ? ? ? Support: YES
?? ? ? ? Comment: MyISAM storage engine
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
?? ?*************************** 4. row ***************************
?? ? ? ? ?Engine: BLACKHOLE
?? ? ? ? Support: YES
?? ? ? ? Comment: /dev/null storage engine (anything you write to it disappears)
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
?? ?*************************** 5. row ***************************
?? ? ? ? ?Engine: CSV
?? ? ? ? Support: YES
?? ? ? ? Comment: CSV storage engine
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
?? ?*************************** 6. row ***************************
?? ? ? ? ?Engine: MEMORY
?? ? ? ? Support: YES
?? ? ? ? Comment: Hash based, stored in memory, useful for temporary tables
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
?? ?*************************** 7. row ***************************
?? ? ? ? ?Engine: ARCHIVE
?? ? ? ? Support: YES
?? ? ? ? Comment: Archive storage engine
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
?? ?*************************** 8. row ***************************
?? ? ? ? ?Engine: InnoDB
?? ? ? ? Support: DEFAULT
?? ? ? ? Comment: Supports transactions, row-level locking, and foreign keys
?? ?Transactions: YES
?? ??? ? ?XA: YES
?? ? ?Savepoints: YES
?? ?*************************** 9. row ***************************
?? ? ? ? ?Engine: PERFORMANCE_SCHEMA
?? ? ? ? Support: YES
?? ? ? ? Comment: Performance Schema
?? ?Transactions: NO
?? ??? ? ?XA: NO
?? ? ?Savepoints: NO
5.3、關于mysql常用的存儲引擎介紹一下
myisam存儲引擎?
?? ?他管理的表具有一下特征:
?? ??? ?使用三個文件表示每個表:
?? ??? ??? ?格式文件 - 存儲表結構的定義(mytable.frm)
?? ??? ??? ?數據文件 - 存儲表行的內容(mytable.MYD)
?? ??? ??? ?索引文件 - 存儲表上索引(mytable.MYI):索引是一本書的目錄,縮小掃描范圍,提高效率
?? ??? ?可被轉換為壓縮、只讀表來節省空間
?? ??? ?對于一張表來說,只要是主鍵或者加有unique約束的字段會自動創建索引
?? ??? ?MyISAM存儲引擎特點:
?? ??? ??? ?可被轉換為壓縮,只讀表來節省空間
?? ??? ??? ?這是這種存儲引擎的優勢
InnoDB存儲引擎?
?? ?這是mysql默認的存儲引擎,同時也是一個重量級的存儲引擎
?? ?InnoDB支持事物,支持數據可崩潰后自動回復機制
?? ?InnoDB存儲引擎最主要的特點是:非常安全
?? ?InnoDB最大的特點就是支持事務:
?? ??? ?以保證數據的安全。效率不是很高,并且也不能壓縮,不能轉換為只讀
?? ??? ?不能很好的節省存儲空間
MEMORY存儲引擎?
?? ?使用MEMORY存儲引擎的表,其數據存儲在內存中,且行的長度固定,這兩個特點
?? ?使得MEMORY存儲引擎非常快
?? ?MEMORY存儲引擎管理的表具有下列特征:
?? ??? ?在數據庫目錄內,每個表均以.frm格式的文件表示
?? ??? ?表數據及索引被存儲在內存中。(目的就是快)
?? ??? ?表級鎖機制
?? ??? ?不能包含TEXT或BLOB字段
?? ?
?? ?MEMORY存儲引擎以前被稱為HEAP引擎
?? ?MEMORY引擎優點:查詢效率是最高的。不需要和硬盤交互
?? ?MEMORY引擎缺點:不安全,關機之后數據消失。因為數據和索引都是在內存當中
6、事物(重點,必須理解)
6.1、什么是事物?
?? ?一個事物其實就是一個完整的業務邏輯。
?? ?是一個最小的工作單元。不可再分
?? ?什么是一個完整的業務邏輯?
?? ??? ?假設轉賬,從A賬戶向B賬戶中轉賬10000
?? ??? ?將A賬戶的錢減去10000(uptate語句)
?? ??? ?將B賬戶的錢加上10000(uptate語句)
?? ??? ?這就是一個完整的業務邏輯。
?? ??? ?以上的操作是最小的工作單元,要么同時成功,要么同時失敗,不可再分
?? ??? ?這兩個uptate語句要求必須同時成功或者同時失敗
6.2、只有DML語句才會有事務這一說,其他語句和事務無關!!!
?? ?insert
?? ?delete
?? ?update
?? ?只有以上三個語句和事務有關系,其他的都沒有關系
?? ?因為只有以上的三個語句是數據庫表中的數據進行增、刪、改的
?? ?只要你的操作一旦涉及到數據的增、刪、改,那么就一定要考慮安全問題
?? ?數據安全放在第一位
6.3、假設所有的業務,只要一條DML語句就能完成,還有必要存在事物機制嗎?
?? ?正是因為要做某件事的時候,需要多條DML語句共同聯合起來才能完成
?? ?所有需要事物的存在。如果任何一件復雜的事都能一條DML語句搞定,那么
?? ?事物就沒有存在的價值了
?? ?到底什么是事務呢?
?? ??? ?說到底,說到本質上,一個事物其實就是多條DML語句同時成功,同時失敗。
?? ?事物:就是批量的DML語句同時成功,或者同時失敗
6.4、事務是怎么做到多條DML語句同時成功和同時失敗的呢?
?? ?
?? ?InnoDB存儲引擎:提供一組用來記錄事務性活動的日志文件
?? ?事務開啟了:
?? ?insert
?? ?insert
?? ?delete
?? ?update
?? ?insert
?? ?update
?? ?事務結束了
?? ?在事務的執行過程中,每一條DML的操作都會記錄到“事務性活動的日志文件”中
?? ?在事務的執行過程中,我們可以提交事務,也可以回滾事務。
?? ?提交事務?
?? ??? ?清空事務性活動的日志文件,將數據全部徹底持久化到數據庫表中
?? ??? ?提交事務標志著,事務的結束。并且是一種全部成功的結束
?? ?回滾事務?
?? ??? ?將之前所有的DML操作全部撤銷,并且清空事務性活動的日志文件
?? ??? ?回滾事務標志著,事務的結束,并且是一種全部失敗的結束
6.5、怎么提交事務,怎么回滾事務?
?? ?提交事務:rommit; 語句
?? ?回滾事務:rollback;
?? ?事務對應的英語單詞是:transaction
?? ?測試一下,在mysql當中默認的事務行為是怎么樣的?
?? ??? ?mysql默認情況下是支持自動提交事務的。(自動提交)
?? ??? ?什么是自動提交?
?? ??? ??? ?每執行一條DML語句,就提交一次
?? ?怎么將mysql的自動提交機制關閉掉呢?
?? ??? ?先執行這個命令:start transaction;
?? ?演示事務:
?? ?------------------------------回滾事務-------------------------
?? ?mysql> show tables;
?? ?+-----------------+
?? ?| Tables_in_zheng |
?? ?+-----------------+
?? ?| dept ? ? ? ? ? ?|
?? ?| dept_bak ? ? ? ?|
?? ?| emp ? ? ? ? ? ? |
?? ?| emp2 ? ? ? ? ? ?|
?? ?| salgrade ? ? ? ?|
?? ?| t_protect ? ? ? |
?? ?| t_user ? ? ? ? ?|
?? ?| t_vip ? ? ? ? ? |
?? ?+-----------------+
?? ?8 rows in set (0.01 sec)
?? ?mysql> select * from emp2;
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| EMPNO | ENAME ?| JOB ? ? ? | MGR ?| HIREDATE ? | SAL ? ? | COMM ? ?| DEPTNO |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| ?7369 | SMITH ?| CLERK ? ? | 7902 | 1980-12-17 | ?800.00 | ? ?NULL | ? ? 20 |
?? ?| ?7499 | ALLEN ?| SALESMAN ?| 7698 | 1981-02-20 | 1600.00 | ?300.00 | ? ? 30 |
?? ?| ?7521 | WARD ? | SALESMAN ?| 7698 | 1981-02-22 | 1250.00 | ?500.00 | ? ? 30 |
?? ?| ?7566 | JONES ?| MANAGER ? | 7839 | 1981-04-02 | 2975.00 | ? ?NULL | ? ? 20 |
?? ?| ?7654 | MARTIN | SALESMAN ?| 7698 | 1981-09-28 | 1250.00 | 1400.00 | ? ? 30 |
?? ?| ?7698 | BLAKE ?| MANAGER ? | 7839 | 1981-05-01 | 2850.00 | ? ?NULL | ? ? 30 |
?? ?| ?7782 | CLARK ?| MANAGER ? | 7839 | 1981-06-09 | 2450.00 | ? ?NULL | ? ? 10 |
?? ?| ?7788 | SCOTT ?| ANALYST ? | 7566 | 1987-04-19 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7839 | KING ? | PRESIDENT | NULL | 1981-11-17 | 5000.00 | ? ?NULL | ? ? 10 |
?? ?| ?7844 | TURNER | SALESMAN ?| 7698 | 1981-09-08 | 1500.00 | ? ?0.00 | ? ? 30 |
?? ?| ?7876 | ADAMS ?| CLERK ? ? | 7788 | 1987-05-23 | 1100.00 | ? ?NULL | ? ? 20 |
?? ?| ?7900 | JAMES ?| CLERK ? ? | 7698 | 1981-12-03 | ?950.00 | ? ?NULL | ? ? 30 |
?? ?| ?7902 | FORD ? | ANALYST ? | 7566 | 1981-12-03 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7934 | MILLER | CLERK ? ? | 7782 | 1982-01-23 | 1300.00 | ? ?NULL | ? ? 10 |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?14 rows in set (0.01 sec)
?? ?mysql> start transaction;
?? ?Query OK, 0 rows affected (0.00 sec)
?? ?mysql> delete from emp2;
?? ?Query OK, 14 rows affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?Empty set (0.00 sec)
?? ?mysql> insert into emp2 values(1111,'aaa','aaa',2222,'1984-1-5',744,0,10);
?? ?Query OK, 1 row affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?+-------+-------+------+------+------------+--------+------+--------+
?? ?| EMPNO | ENAME | JOB ?| MGR ?| HIREDATE ? | SAL ? ?| COMM | DEPTNO |
?? ?+-------+-------+------+------+------------+--------+------+--------+
?? ?| ?1111 | aaa ? | aaa ?| 2222 | 1984-01-05 | 744.00 | 0.00 | ? ? 10 |
?? ?+-------+-------+------+------+------------+--------+------+--------+
?? ?1 row in set (0.00 sec)
?? ?mysql> rollback;
?? ?Query OK, 0 rows affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| EMPNO | ENAME ?| JOB ? ? ? | MGR ?| HIREDATE ? | SAL ? ? | COMM ? ?| DEPTNO |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| ?7369 | SMITH ?| CLERK ? ? | 7902 | 1980-12-17 | ?800.00 | ? ?NULL | ? ? 20 |
?? ?| ?7499 | ALLEN ?| SALESMAN ?| 7698 | 1981-02-20 | 1600.00 | ?300.00 | ? ? 30 |
?? ?| ?7521 | WARD ? | SALESMAN ?| 7698 | 1981-02-22 | 1250.00 | ?500.00 | ? ? 30 |
?? ?| ?7566 | JONES ?| MANAGER ? | 7839 | 1981-04-02 | 2975.00 | ? ?NULL | ? ? 20 |
?? ?| ?7654 | MARTIN | SALESMAN ?| 7698 | 1981-09-28 | 1250.00 | 1400.00 | ? ? 30 |
?? ?| ?7698 | BLAKE ?| MANAGER ? | 7839 | 1981-05-01 | 2850.00 | ? ?NULL | ? ? 30 |
?? ?| ?7782 | CLARK ?| MANAGER ? | 7839 | 1981-06-09 | 2450.00 | ? ?NULL | ? ? 10 |
?? ?| ?7788 | SCOTT ?| ANALYST ? | 7566 | 1987-04-19 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7839 | KING ? | PRESIDENT | NULL | 1981-11-17 | 5000.00 | ? ?NULL | ? ? 10 |
?? ?| ?7844 | TURNER | SALESMAN ?| 7698 | 1981-09-08 | 1500.00 | ? ?0.00 | ? ? 30 |
?? ?| ?7876 | ADAMS ?| CLERK ? ? | 7788 | 1987-05-23 | 1100.00 | ? ?NULL | ? ? 20 |
?? ?| ?7900 | JAMES ?| CLERK ? ? | 7698 | 1981-12-03 | ?950.00 | ? ?NULL | ? ? 30 |
?? ?| ?7902 | FORD ? | ANALYST ? | 7566 | 1981-12-03 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7934 | MILLER | CLERK ? ? | 7782 | 1982-01-23 | 1300.00 | ? ?NULL | ? ? 10 |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
------------------------------提交事務--------------------------------------
?? ?mysql> start transaction;
?? ?Query OK, 0 rows affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| EMPNO | ENAME ?| JOB ? ? ? | MGR ?| HIREDATE ? | SAL ? ? | COMM ? ?| DEPTNO |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?| ?7369 | SMITH ?| CLERK ? ? | 7902 | 1980-12-17 | ?800.00 | ? ?NULL | ? ? 20 |
?? ?| ?7499 | ALLEN ?| SALESMAN ?| 7698 | 1981-02-20 | 1600.00 | ?300.00 | ? ? 30 |
?? ?| ?7521 | WARD ? | SALESMAN ?| 7698 | 1981-02-22 | 1250.00 | ?500.00 | ? ? 30 |
?? ?| ?7566 | JONES ?| MANAGER ? | 7839 | 1981-04-02 | 2975.00 | ? ?NULL | ? ? 20 |
?? ?| ?7654 | MARTIN | SALESMAN ?| 7698 | 1981-09-28 | 1250.00 | 1400.00 | ? ? 30 |
?? ?| ?7698 | BLAKE ?| MANAGER ? | 7839 | 1981-05-01 | 2850.00 | ? ?NULL | ? ? 30 |
?? ?| ?7782 | CLARK ?| MANAGER ? | 7839 | 1981-06-09 | 2450.00 | ? ?NULL | ? ? 10 |
?? ?| ?7788 | SCOTT ?| ANALYST ? | 7566 | 1987-04-19 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7839 | KING ? | PRESIDENT | NULL | 1981-11-17 | 5000.00 | ? ?NULL | ? ? 10 |
?? ?| ?7844 | TURNER | SALESMAN ?| 7698 | 1981-09-08 | 1500.00 | ? ?0.00 | ? ? 30 |
?? ?| ?7876 | ADAMS ?| CLERK ? ? | 7788 | 1987-05-23 | 1100.00 | ? ?NULL | ? ? 20 |
?? ?| ?7900 | JAMES ?| CLERK ? ? | 7698 | 1981-12-03 | ?950.00 | ? ?NULL | ? ? 30 |
?? ?| ?7902 | FORD ? | ANALYST ? | 7566 | 1981-12-03 | 3000.00 | ? ?NULL | ? ? 20 |
?? ?| ?7934 | MILLER | CLERK ? ? | 7782 | 1982-01-23 | 1300.00 | ? ?NULL | ? ? 10 |
?? ?+-------+--------+-----------+------+------------+---------+---------+--------+
?? ?14 rows in set (0.00 sec)
?? ?mysql> detele from emp2 ;
?? ?ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'detele from emp2' at line 1
?? ?mysql> delete from emp2 ;
?? ?Query OK, 14 rows affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?Empty set (0.00 sec)
?? ?mysql> commit;
?? ?Query OK, 0 rows affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?Empty set (0.00 sec)
?? ?mysql> rollback;
?? ?Query OK, 0 rows affected (0.00 sec)
?? ?mysql> select * from emp2;
?? ?Empty set (0.00 sec)
6.6、事務包括四個特性?(重要)
?? ?A:原子性:
?? ??? ?說明事務是最小的工作單元,不可再分
?? ?
?? ?C:一致性:
?? ??? ?所有事務要求,在同一個事務當中,所有操作必須同時成功,或者同時失敗
?? ??? ?以保證數據的安全性
?? ?I:隔離性:
?? ??? ?A事務和B事務之間具有一定的隔離
?? ??? ?教室A和教室B之間有一道墻,這道墻就是隔離性
?? ??? ?A事務在操作一張表的時候,另一個事務B也操作這張表會怎么樣?
?? ?D:持久性:
?? ??? ?事務最終結束的一個保證。事務提交,就相當于將沒有保存到硬盤上的數據保存到硬盤上
6.7、重點研究一下事務的隔離性!!!
?? ?A教室和B教室中間有一道墻,這道墻可以很厚,也可以很薄。這就是事務的隔離級別
?? ?這道墻越厚,表示隔離級別就越高
?? ?事務和事務之間的隔離級別有哪些呢?
?? ??? ?讀未提交:read uncommitted(最低的隔離級別)《沒有提交就讀取到了》
?? ??? ??? ?什么是讀未提交?
?? ??? ??? ??? ?事務A可以讀取事務B還沒有提交的數據
?? ??? ??? ?這種隔離級別存在的問題就是:
?? ??? ??? ??? ?臟讀現象(Dirty read)
?? ??? ??? ??? ?我們稱為臟數據
?? ??? ?
?? ??? ?讀已提交:read committed《提交之后才可以讀取到》
?? ??? ??? ?什么是讀已提交?
?? ??? ??? ??? ?事務A可以讀取事務B已經提交的數據
?? ??? ??? ?這種隔離級別解決了什么問題?
?? ??? ??? ??? ?解決了臟讀現象
?? ??? ??? ?這種隔離級別存在什么問題?
?? ??? ??? ??? ?不可重復讀取數據
?? ??? ??? ??? ?什么是不可重復讀取數據呢?
?? ??? ??? ??? ??? ?在事務開啟之后,第一次讀取到的數據是3條,當前事務還沒有結束
?? ??? ??? ??? ??? ?可能第二次在讀取的時候,讀到的數據就是4條了,3不等于4,稱為
?? ??? ??? ??? ??? ?不可重復讀取(就是事務B在執行的時候讀取了兩次A事務中的數據,
?? ??? ??? ??? ??? ?事務A可能變化了多次,數據也就不一樣了)
?? ??? ??? ??? ?這種隔離級別是比較真實的數據,每一次讀到的數據是絕對的真實
?? ??? ??? ??? ?oracle數據庫默認的隔離級別是:read committed
?? ??? ?可重復讀:repeatable read《提交之后也讀不到,永遠讀取的都是剛開啟事務時的數據》
?? ??? ??? ?什么是可重復讀取?
?? ??? ??? ??? ?事務A開啟之后,不管是多久,每一次事務A讀取到的數據都是一致的,即使事務B將數據
?? ??? ??? ??? ?已經修改,并且提交了,事務A讀取到的數據還是沒有發生改變,這就是可重復讀
?? ??? ??? ?可重復讀解決了什么問題呢?
?? ??? ??? ??? ?解決了不可重復讀取數據
?? ??? ??? ?可重復讀存在的問題是什么?
?? ??? ??? ??? ?可能會出現幻影讀
?? ??? ??? ??? ?每一次讀取到的數據都是幻象。不夠真實
?? ??? ??? ?早晨9點開始開啟了事務,只要事務不結束,到晚上9點,讀到的數據還是那樣
?? ??? ?例子:比如銀行要進行總賬,執行過程從1點到3點結束,如果中途有人存取錢的話,數據就不正確了,所以使用
?? ??? ?可重復讀,,事務A進行讀取總賬,事務B進行存取錢,事務A的數據一直都是1點那個數據,事務B進行提交了,事務A
?? ??? ?也不變化,而讀已提交就不行,他會將數據進行更新,對應出現的問題是:不可重復讀取數據?
?? ??? ?序列化/串行化:serializable(最高的隔離級別):
?? ??? ??? ?這是最高隔離級別,效率最低。解決了所有的問題
?? ??? ??? ?這種級別表示事務排隊,不能并發
?? ??? ??? ?每一次讀取到的數據都是最真實的,并且效率是最低的
6.8、驗證各種隔離級別
查看隔離級別:select @@tx_isolation;
?? ?+-----------------+
?? ?| @@tx_isolation ?|
?? ?+-----------------+
?? ?| REPEATABLE-READ |
?? ?mysql中默認的隔離級別
驗證:read uncommit
設置全局的隔離級別:set global transaction isolation level read uncommitted;
改完之后退出一下重新進入
事務A?? ??? ??? ??? ??? ?事務B
--------------------------------------------------------------------------------------------
use zheng;
?? ??? ??? ??? ??? ??? ?use zheng;
start transaction;
select * from t_user;
?? ??? ??? ??? ??? ??? ?start transaction;
?? ??? ??? ??? ??? ??? ?insert into t_user values('zhangsan');
select * from t_user;
驗證:read committed
設置全局的隔離級別:set global transaction isolation level read committed;
改完之后退出一下重新進入
事務A?? ??? ??? ??? ??? ?事務B
--------------------------------------------------------------------------------------------
use zheng;
?? ??? ??? ??? ??? ??? ?use zheng;
start transaction;
?? ??? ??? ??? ??? ??? ?start transaction;
select * from t_user;
?? ??? ??? ??? ??? ??? ?insert into t_user values('zhangsan');
select * from t_user;?? ?
?? ??? ??? ??? ??? ??? ?commit;
select * from t_user;
驗證:repeatable read
設置全局的隔離級別:set global transaction isolation level repeatable read;
改完之后退出一下重新進入
事務A?? ??? ??? ??? ??? ?事務B
--------------------------------------------------------------------------------------------
use zheng;
?? ??? ??? ??? ??? ??? ?use zheng;
start transaction;
?? ??? ??? ??? ??? ??? ?start transaction;
select * from t_uesr;
?? ??? ??? ??? ??? ??? ?insert into t_uesr values('lisi');
?? ??? ??? ??? ??? ??? ?insert into t_uesr values('wangwu');
select * from t_user;
?? ??? ??? ??? ??? ??? ?commit;
select * from t_user;
驗證:serializable
設置全局的隔離級別:set global transaction isolation level repeatable read;
改完之后退出一下重新進入
事務A?? ??? ??? ??? ??? ?事務B
--------------------------------------------------------------------------------------------
use zheng;
?? ??? ??? ??? ??? ??? ?use zheng;
start transaction;
?? ??? ??? ??? ??? ??? ?start transaction;
select * from t_uesr;
insert into t_user values('abc');
?? ??? ??? ??? ??? ??? ?select *from t_user;