1. 程式人生 > 實用技巧 >MySQL約束事務檢視和儲存過程

MySQL約束事務檢視和儲存過程

約束

非空約束

not null

預設約束

default

主鍵約束

primary key

唯一約束

unique

檢查約束

check mysql不支援檢查約束,不報錯但是無效果

外來鍵約束

foreign key
CREATE TABLE EmpInfo(
   EmpID INT PRIMARY KEY AUTO_INCREMENT,	主鍵約束
   EmpName VARCHAR(20) NOT NULL,	非空約束
   EmpSex VARCHAR(2) NOT NULL DEFAULT '男',	預設約束
   EmpBirth DATETIME NOT NULL,	
   EmpTel VARCHAR(20) NOT NULL UNIQUE,	唯一約束
   DeptID VARCHAR(10) NOT NULL,
   CONSTRAINT FK_DeptID FOREIGN KEY(DeptID) REFERENCES DeptInfo(DeptID)	外來鍵約束
)ENGINE=INNODB CHARSET=utf8 AUTO_INCREMENT=1001;

事務

事務的ACID屬性

原子性:事務是一組不可再分的業務邏輯單元,要麼全部執行,要麼全部不執行

一致性:事務使資料從一個一致狀態切換到另外一個一致的狀態

隔離性:事務的執行不受其他事務的干擾

永續性:一個事務一旦提交則不能反悔

事務併發問題

髒讀
讀到了別人還未提交的資料

不可重複讀(修改)
前後讀取,資料內容不一致,操作過於頻繁,每次拿到的都是新的資料,主要是修改引發的

幻讀(插入/刪除)
前後讀取,資料的條數不一致,主要是插入和刪除引起的

事務隔離級別

讀未提交
會產生髒資料(髒讀)

讀已提交【SQLServer預設隔離級別】
解決了髒讀問題,但是未解決不可重複讀和幻讀

可重複讀【MySQL的預設隔離級別】
解決了髒讀,不可重複讀和幻讀

序列讀
會出現等待的情況

檢視

(1)檢視是一張虛擬的表,和普通標一樣的使用方法
(2)檢視只儲存了SQL邏輯,但是沒有儲存查詢結果

應用場景:
-- 多個地方用到同樣的查詢結果
-- 該sql查詢語句比較複雜

檢視的建立

語法:
create view 檢視名
as
查詢語句;
-- 檢視的建立
create view myv1
as
select * from student;

select * from myv1 where score between 80 and 100;

檢視的修改

語法1:
create or replace view 檢視名
as
查詢語句;

語法2:
alter view 檢視名
as
查詢語句;
-- 檢視的修改
-- (1)
create or replace view myv1
as
select * from student where score between 80 and 100;

select * from myv1;

-- (2)
alter view myv1
as 
select * from student where score between 60 and 80;

select * from myv1;

檢視的刪除

語法:
drop view 檢視名,檢視名,……;

檢視的檢視

(1)desc 檢視名;

(2)show create view 檢視名;[視覺化介面顯示效果不好]
可以使用:show create view 檢視名\G;[命令列使用]

儲存過程

儲存過程是一組預先編譯好的SQL語句的集合(批處理語句)

好處:(儲存過程類似於java中的方法)
(1)提高了程式碼的重用性
(2)簡化操作
(3)減少編譯次數,並且減少和資料庫連線的次數,提高效率

儲存過程的建立

語法:
create procedure 儲存過程名(引數列表)
begin
	儲存過程體(一組合法的SQL語句)
end

注意:
引數列表包含三部分:引數模式	引數名	引數型別
	例如:in name varchar(50)
	
引數模式:
in:輸入,該引數需要呼叫放傳入值
out:輸出,改引數作為返回值
inout,既可以做輸入也可以做輸出,既可以傳入值,也可以返回值

儲存過程體:
(1)如果只有一句話,可以省略begin end
(2)多條SQL語句,每條結尾必須加分號;儲存過程的結尾可以使用delimiter重新設定
語法:
delimiter 結束標記
案例
delimiter $

呼叫:call 儲存過程名(實參列表);
-- 檢視的建立
create view myv1
as
select * from student;

select * from myv1 where score between 80 and 100;

-- 檢視的修改
-- (1)
create or replace view myv1
as
select * from student where score between 80 and 100;

select * from myv1;

-- (2)
alter view myv1
as 
select * from student where score between 60 and 80;

select * from myv1;

-- 儲存過程的建立
-- (1)空參列表
delimiter $
create procedure myp1()
begin
	insert into student
	values(6,53),(7,88),(8,72);
end
$

call myp1();

-- (2)有參列表
delimiter $
create procedure myp2(in inId int)
begin
	select * from student where id = inId;	
end
$

call myp2(3);

-- 例項:建立儲存過程,判斷使用者是否登入成功
delimiter $
create procedure myp3(in uname varchar(20),in upwd varchar(20))
begin
	declare result int default 0; # 宣告並初始化
	
	select count(*) into result # 賦值
	from `user` u
	where u.uname = uname and u.upwd = upwds
	
	select if(result > 0, '成功', '失敗')
end
$

call myp3('張三','123456');

-- (3)out引數
delimiter $
create procedure myp4(in inId int,out outScore int) 
begin
	select score into outScore
	from student 
	where id = inID;
end
$

call myp4(1,@outScore);	# @outScore是使用者變數
select @outScore;

-- inout一樣的用法就不舉例了

儲存過程的刪除

drop procedure 儲存過程名;
-- 不支援一次刪除多個儲存過程

儲存過程的檢視

desc 儲存過程名; # 不支援,報錯
show create procedure 儲存過程名;