MySQL約束事務檢視和儲存過程
阿新 • • 發佈:2020-08-07
約束
非空約束
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 儲存過程名;