操作表
視圖
視圖是虛擬的表。使用視圖可以重用SQL語句,簡化復(fù)雜的SQL操作,更改數(shù)據(jù)格式和表示等;創(chuàng)建視圖后可以用與表基本相同的方式使用之,可以SELECT,過濾,排序,聯(lián)結(jié),甚至添加和更新數(shù)據(jù)(添加與更新存在某些限制)。
視圖本身不包含數(shù)據(jù),它們返回的數(shù)據(jù)是從其他表中檢索出來的,在添加或更改源數(shù)據(jù)時(shí)視圖將返回改變過的數(shù)據(jù)。
部署使用大量視圖的應(yīng)用前應(yīng)該進(jìn)行性能測試。
- 與表一樣,視圖必須唯一命名
- 對于可以創(chuàng)建的視圖數(shù)目沒有限制
- 創(chuàng)建視圖必須有足夠的訪問權(quán)限
- 視圖可以嵌套,可以利用從其他視圖中檢索數(shù)據(jù)的查詢來創(chuàng)建視圖
- ORDER BY可以用在視圖中,如果檢索視圖時(shí)也用了ORDER BY則會將視圖中的ORDER BY覆蓋
- 視圖不能索引,也不能有關(guān)聯(lián)的觸發(fā)器或默認(rèn)值
- 視力可以和表一起使用,比如SELECT時(shí)聯(lián)結(jié)表和視圖
// 創(chuàng)建一個名為productcustomers的視圖,隱藏了一個復(fù)雜的多表查詢
CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;
// 從視圖中檢索數(shù)據(jù)
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';
存儲過程
存儲過程就是為了方便以后使用而保存的一條或多條SQL語句的集合,可視為批處理,雖然它們的作用不僅限于批處理。
使用存儲過程的理由:簡單、安全、高性能:
//創(chuàng)建
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage FROM products;
END;
//調(diào)用
CALL productpricing();
//刪除
DROP PROCEDURE productpricing;
使用命令行時(shí),如果存儲過程內(nèi)含有;字符,可以使用 DELIMITER臨時(shí)更改語句分隔符。
存儲過程可以接受參數(shù);可以使用DECLARE語句聲明變量,結(jié)合IF等實(shí)現(xiàn)更高級、更強(qiáng)的功能;
使用SHOW CREATE PROCEDURE或SHOW PROCEDURE STATUS獲取存儲過程的信息;
游標(biāo)
觸發(fā)器
觸發(fā)器是Mysql在響應(yīng)以下語句時(shí)自動執(zhí)行的一條MySQL語句(或位于BEGIN與END之間的一組語句):DELETE、INSERT、UPDATE;
創(chuàng)建時(shí)應(yīng)給出:1、唯一的觸發(fā)器名;2、關(guān)聯(lián)的表;3、應(yīng)該響應(yīng)的語句;4、在處理之前還是之后執(zhí)行。
每個表最多支持6個觸發(fā)器;單一觸發(fā)器不能與多個事件或多個表關(guān)聯(lián);
觸發(fā)器不能更新或覆蓋,只能先刪除再重新創(chuàng)建;
如果BEFORE觸發(fā)器失敗,則請求的操作不會被執(zhí)行;如果BEFORE觸發(fā)器或語句本身失敗,AFTER觸發(fā)器將不會得到執(zhí)行;
CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num
DROP TRIGGER newproduct;
INSERT觸發(fā)器
- INSERT觸發(fā)器代碼內(nèi)可引用一個名為NEW的虛擬表訪問被插入的行
- BEFORE INSERT觸發(fā)器中可以更新NEW中的值
- AUTO_INCREMENT列,NEW在INSERT之前包含0,INSET后包含新的自動生成值
DELETE觸發(fā)器 - DELETE觸發(fā)器代碼內(nèi)可以一個名為OLD的虛擬表訪問被刪除的行
- OLD中的值全為只讀,不能更新
UPDATE觸發(fā)器 - UPDATE觸發(fā)器的代碼內(nèi)可以引用OLD訪問舊的值,引用NEW訪問新更新的值
- BEFORE UPDATE觸發(fā)器中,NEW中的值可以更新
- OLD中的值全為只讀,不能更新
總結(jié)
1、通常before用于數(shù)據(jù)的驗(yàn)證和凈化(為了保證插入表中的數(shù)據(jù)確實(shí)是需要的數(shù)據(jù)) 也適用于update觸發(fā)器。
2、與其他DBMS相比,MySQL 5中支持的觸發(fā)器相當(dāng)初級,未來的MySQL版本中估計(jì)會存在一些改進(jìn)和增強(qiáng)觸發(fā)器的支持。
3、創(chuàng)建觸發(fā)器可能需要特殊的安全訪問權(quán)限,但是觸發(fā)器的執(zhí)行時(shí)自動的,如果insert,update,或者delete語句能夠執(zhí)行,則相關(guān)的觸發(fā)器也能執(zhí)行。
4、用觸發(fā)器來保證數(shù)據(jù)的一致性(大小寫,格式等)。在觸發(fā)器中執(zhí)行這種類型的處理的優(yōu)點(diǎn)就是它總是進(jìn)行這種處理,而且透明的進(jìn)行,與客戶機(jī)應(yīng)用無關(guān)。
5、觸發(fā)器的一種非常有意義的使用就是創(chuàng)建審計(jì)跟蹤。使用觸發(fā)器,把更改(如果需要,甚至還有之前和之后的狀態(tài))記錄到另外一個表是非常容易的。
6、MySQL觸發(fā)器不支持call語句,無法從觸發(fā)器內(nèi)調(diào)用存儲過程。
事務(wù)
保證成批的SQL操作要么完全執(zhí)行,要么完全不執(zhí)行;
MyISAM不支持事務(wù),InnoDB支持;
START TRANSACTION開始一個事務(wù);
ROLLBACK回滾事務(wù);
COMMIT提交事務(wù);
SAVEPOINT創(chuàng)建保留點(diǎn),可以回滾到該處:ROLLBACK TO ...
默認(rèn)的MySQL行為是自動提交所有更改,可以使MySQL不自動提交更改(針對每個連接,而不是服務(wù)器):SET autocommit = 0;