java學習之路——第四十五天
檢視:檢視是由查詢結果形成的一張虛擬表 ,並不是我們自行建立的表,而是將一個頻繁的查詢結果當成一張臨時表來用。
語法:create view as select 語句
為什麼要有檢視?
1、可以簡化查詢
2、可以進行許可權控制
把表的許可權封閉,但是開發相應的檢視許可權,視圖裡只開放部分資料
3、大資料分表時可以用到
拆表
檢視與表的關係:
檢視是表的查詢結果,自然表的資料改變了,影響檢視的結果
檢視必須包含表中沒有預設值也不能為空的列
觸發器:trigger 一觸即發
作用:監視某種情況並觸發某種操作
四要素:監視地點 監視事件 觸發時間 觸發事件
語法:
create trigger 觸發器名
觸發時間 觸發事件 on 監視地點
for each row(
begin
表資料的操作語句,
end;
因為sql語句預設是以;結尾,所以在使用觸發器的時候需要將結束符修改一下
修改結束符的語句:delimiter $ (設定$為結束符)
觸發事件:after before
區別:after是先完成資料的增刪改再觸發,觸發的語句晚於監視的增刪改們無法影響前面的增刪改動作
before是先完成觸發,再增刪改,觸發的語句先於增刪改發生,我們有機會判斷,修改即將發生的操作。
案例:# 檢視
# 語法:create view 檢視名 as select 語句;
CREATE TABLE person(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME CHAR(10),
age INT
);
INSERT INTO person(NAME,age) VALUES('張三',12),('李四',13),('王五',23),('馬六',24);
CREATE VIEW view1 AS SELECT NAME FROM person;
-- 原表發生改變,檢視會不會發生改變
INSERT INTO person(NAME,age) VALUES ('xm',22);
-- 檢視發生改變 ,原表會不會發生改變
DELETE FROM view1 WHERE NAME='xm';
CREATE TABLE g(
id INT,
NAME VARCHAR(10),
num INT
)CHARSET utf8;
CREATE TABLE o(
oid INT,
gid INT,
much INT
)CHARSET utf8;
INSERT INTO g VALUES(1,'豬',22),
(2,'羊',19),(3,'狗',12),(4,'貓',8);
#1.新增訂單,庫存減少
-- 建立一個觸發器
DELIMITER $
CREATE TRIGGER tg1
AFTER INSERT ON o
FOR EACH ROW
BEGIN
UPDATE g SET num = num - new.much WHERE id=new.gid;
END$
-- 新增訂單
INSERT INTO o VALUES(2,3,3);
-- 刪除訂單庫存增加
DELIMITER $
CREATE TRIGGER tg2
AFTER DELETE ON o
FOR EACH ROW
BEGIN
UPDATE g SET num = num + old.much WHERE id=old.gid;
END$
DELETE FROM o WHERE oid=2;
-- 修改訂單的數量時,庫存相應改變
DELIMITER $
CREATE TRIGGER tg3
AFTER UPDATE ON o
FOR EACH ROW
BEGIN
UPDATE g SET num=num+old.much-new.much WHERE id=old.gid;
END$
UPDATE o SET much=1 WHERE oid=1;
-- 強制把訂單的商品數量改成5
DELIMITER $
CREATE TRIGGER tg4
BEFORE INSERT ON o
FOR EACH ROW
BEGIN
IF new.much>5 THEN
SET new.much=5;
END IF;
UPDATE g SET num=num-new.much WHERE id=new.gid;
END$
-- 新增訂單
INSERT INTO o VALUES(1,1,10);