事務 1.概念 一條或者多條sql語句的集合! 事務:就是一堆操作的集合,他們同生共死。要麼都執行成功,要麼都執行失敗2.事務的特性 ACID A:原子性 完整的,不可分割的 原子性 (Atomicity):在事務中的操作,要麼都執行,要麼都不執行! C: 一致性 事務執行完畢後,數據的狀態是一致的 ...
事務
1.概念
一條或者多條sql語句的集合!
事務:就是一堆操作的集合,他們同生共死。要麼都執行成功,要麼都執行失敗
2.事務的特性 ACID
A:原子性 完整的,不可分割的
原子性 (Atomicity):在事務中的操作,要麼都執行,要麼都不執行!
C: 一致性 事務執行完畢後,數據的狀態是一致的()
一致性(Consistency):事務必須保證資料庫從一個一致性的狀態變成另一個一致性的狀態!
I: ISOLation 隔離性 兩個事務執行互不影響
隔離性(Isolation):每個事務之間互不幹擾!哪怕是併發執行也不幹擾!
D: 永久性 事務執行完後,對數據的影響是永久的。
持久性(Durability):事務一旦被改變,那麼對資料庫中數據的影響是永久性的!
3.事務操作的關鍵字
自動提交事務開關set autocommit=0
開始事務 start transaction /begin
提交事務 commit
回滾事務 rollback
set autocommit=1
4.事務+++存儲過程 轉賬的例子
DELIMITER $$
CREATE PROCEDURE usp_transfer()
BEGIN
##錯誤總數預設是0
DECLARE t_error INTEGER DEFAULT 0;
## continue 繼續 hanlder 執行 並且對 t_error重新賦值為1
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
SET autocommit=0;
START TRANSACTION;
UPDATE bank SET balance=balance-100 WHERE cid=1;
UPDATE bank SET balance =balance+100 WHERE cid=2;
IF t_error > 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
SET autocommit=1;
END$$
DELIMITER ;
CALL test_sp800()
定義一個存儲過程的最簡易的語法是
delimiter $$
create procedure usp_stulist()
begin
select * from student
end$$
delimiter;
模擬 銀行轉賬!
-- 創建資料庫
CREATE DATABASE myBank;
-- 切換指定的資料庫
USE myBank;
-- 創建表
CREATE TABLE IF NOT EXISTS bank(
customerName VARCHAR(10) NOT NULL COMMENT '用戶名',
currentMoney DECIMAL(10,2) NOT NULL COMMENT '賬戶餘額'
);
-- 插入數據
INSERT INTO bank VALUES('小黑',50000),('小白',500000);
-- 小黑 給小白 轉賬10000
-- 修改兩條數據
-- 01.小黑-10000
-- 02.小白+10000
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
-- 故意寫錯欄位名稱 讓02 報錯
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
-- 開啟事務 START TRANSACTION 或者 BEGIN
-- 01.02 為一個事務
BEGIN
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
-- 事務回滾 ROLLBACK
-- 提交事務 COMMIT
UPDATE bank SET currentMoney=500000
WHERE customerName='小黑';
-- 證明mysql是預設提交事務的!
SET autocommit=0(關閉事務自動提交) | 1(開啟事務自動提交)
-- 關閉事務自動提交
SET autocommit=0;
BEGIN; -- 開啟事務
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoney=currentMoney+10000
WHERE customerName='小白';
COMMIT; -- 手動提交事務
UPDATE bank SET currentMoney=10000;
ROLLBACK; -- 事務回滾
SET autocommit=1; -- 恢復自動提交
1.概念
一條或者多條sql語句的集合!
事務:就是一堆操作的集合,他們同生共死。要麼都執行成功,要麼都執行失敗
2.事務的特性 ACID
A:原子性 完整的,不可分割的
原子性 (Atomicity):在事務中的操作,要麼都執行,要麼都不執行!
C: 一致性 事務執行完畢後,數據的狀態是一致的()
一致性(Consistency):事務必須保證資料庫從一個一致性的狀態變成另一個一致性的狀態!
I: ISOLation 隔離性 兩個事務執行互不影響
隔離性(Isolation):每個事務之間互不幹擾!哪怕是併發執行也不幹擾!
D: 永久性 事務執行完後,對數據的影響是永久的。
持久性(Durability):事務一旦被改變,那麼對資料庫中數據的影響是永久性的!
3.事務操作的關鍵字
自動提交事務開關set autocommit=1
開始事務 start transaction /begin
提交事務 commit
回滾事務 rollback
set autocommit=1
4.事務+++存儲過程 轉賬的例子
DELIMITER $$
CREATE PROCEDURE usp_transfer()
BEGIN
##錯誤總數預設是0
DECLARE t_error INTEGER DEFAULT 0;
## continue 繼續 hanlder 執行 並且對 t_error重新賦值為1
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
SET autocommit=0;
START TRANSACTION;
UPDATE bank SET balance=balance-100 WHERE cid=1;
UPDATE bank SET balance =balance+100 WHERE cid=2;
IF t_error > 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
SET autocommit=1;
END$$
DELIMITER ;
CALL test_sp800()
定義一個存儲過程的最簡易的語法是
delimiter $$
create procedure usp_stulist()
begin
select * from student
end$$
delimiter;
模擬 銀行轉賬!
-- 創建資料庫
CREATE DATABASE myBank;
-- 切換指定的資料庫
USE myBank;
-- 創建表
CREATE TABLE IF NOT EXISTS bank(
customerName VARCHAR(10) NOT NULL COMMENT '用戶名',
currentMoney DECIMAL(10,2) NOT NULL COMMENT '賬戶餘額'
);
-- 插入數據
INSERT INTO bank VALUES('小黑',50000),('小白',500000);
-- 小黑 給小白 轉賬10000
-- 修改兩條數據
-- 01.小黑-10000
-- 02.小白+10000
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
-- 故意寫錯欄位名稱 讓02 報錯
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
-- 開啟事務 START TRANSACTION 或者 BEGIN
-- 01.02 為一個事務
BEGIN
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
-- 事務回滾 ROLLBACK
-- 提交事務 COMMIT
UPDATE bank SET currentMoney=500000
WHERE customerName='小黑';
-- 證明mysql是預設提交事務的!
SET autocommit=0(關閉事務自動提交) | 1(開啟事務自動提交)
-- 關閉事務自動提交
SET autocommit=0;
BEGIN; -- 開啟事務
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoney=currentMoney+10000
WHERE customerName='小白';
COMMIT; -- 手動提交事務
UPDATE bank SET currentMoney=10000;
ROLLBACK; -- 事務回滾
SET autocommit=1; -- 恢復自動提交
視圖
1.視圖: 就是一張虛擬表,本質上存儲的是一對SQL的集合
-- 視圖 是一張虛擬的表
01.表示一張表的部分數據或者是多張表的綜合數據!
02.結構和數據都是建立在對真表的查詢基礎之上的!
03.視圖中存放的數據其實就是對真實表的引用!
對視圖中的數據進行添加,更新刪除都會影響到真實的表!
04.一個真實的表可以創建N個視圖!
05.如果視圖關聯了多表,不允許增 刪!單表可以增刪改
06.視圖一般都是使用查詢!
2.定義視圖的語法:
create view VW_stulist(VW_視圖的功能)
as
sql語句
小Tip:當多表中有同名列的時候,在視圖這個虛擬表中,只能有一列。手工指定該列是哪個表的
3.視圖的使用 和檢索基本表一樣,直接通過select
select * from VW_stulist
4.刪除視圖
drop view 視圖名
drop table
drop database
drop index
drop constraint
歸根結底:drop 刪除是結構 delete 刪除數據
5.查看所有庫所有視圖
5.1.切換到系統資料庫
use information_schema
5.2.select * from views \G;
6.查看當前庫的所有視圖
show tables status where comment='view'
7.視圖註意事項
1)視圖可以查詢多表數據
2)視圖可以嵌套
3)update,insert,delete不能封裝成視圖內容,通過圖形化界面可以操作數據(操作視圖數據,影響的是基本表)。
4)刪除視圖數據的時候,有一定的限定,數據結果來源於多表的時候,不能刪除
-- 創建一個視圖 只獲取 學生姓名 編號 以及考試成績
CREATE VIEW view_student_result
AS
SELECT s.studentNo 學生編號,studentName 學生姓名,
studentResult 考試成績
FROM student s,result r
WHERE s.`studentNo`=r.`studentNo`
-- 查詢視圖中的內容
SELECT * FROM view_student_result
-- 查詢mysql資料庫中所有的視圖
SELECT * FROM information_schema.views;
-- 刪除視圖
DROP VIEW view_student_result;
-- 創建一個表的視圖 學生姓名,地址,手機號
CREATE VIEW view_student
AS
SELECT studentName 學生姓名,address 地址,phone 手機號
FROM student
-- 查詢視圖
SELECT * FROM view_student