MySQL數(shù)據(jù)庫存儲(chǔ)過程和觸發(fā)器的創(chuàng)建

一、基礎(chǔ)內(nèi)容

(1) 觸發(fā)器是一種實(shí)施復(fù)雜數(shù)據(jù)網(wǎng)整形的特殊存儲(chǔ)過程,在對(duì)表或者視圖執(zhí)行INSERT,UPDATE或者DELETE語句時(shí)自動(dòng)執(zhí)行,以防止對(duì)數(shù)據(jù)進(jìn)行不正確,未授權(quán)或不一致的修改。它不可以像調(diào)用存儲(chǔ)過程一樣由用戶直接調(diào)用執(zhí)行。 創(chuàng)建觸發(fā)器可以在查詢分析器中用SQL語句完成,也可以用企業(yè)管理器完成。在企業(yè)管理器中書寫觸發(fā)器時(shí),通過右鍵單機(jī)創(chuàng)建觸發(fā)器的表,在彈出的快捷菜單中依次選擇“所有任務(wù)”->“管理觸發(fā)器”命令,就打開“觸發(fā)器屬性”對(duì)話框,然后在該對(duì)話框的“文本”框中輸入常見觸發(fā)器的SQL語句。
在數(shù)據(jù)庫eduTest中,創(chuàng)建觸發(fā)器的操作,然后在相關(guān)的表上執(zhí)行INSERT,UPDATE,或DELETE語句,觀察他們的執(zhí)行結(jié)果。通過經(jīng)過觸發(fā)器的操作應(yīng)該了解觸發(fā)器的執(zhí)行過程。如何建立,刪除觸發(fā)器。

(2)存儲(chǔ)過程用來對(duì)一些基本的表的操作進(jìn)行封裝,在需要進(jìn)行操作時(shí)進(jìn)行調(diào)用,大大減輕編程的冗余性,增加了程序編寫的條理性和易讀性,以及可重用性;

(3)存儲(chǔ)過程與觸發(fā)器結(jié)合編程實(shí)驗(yàn);

二、操作語句

觸發(fā)器和存儲(chǔ)過程結(jié)合使用:

(1)/測試用/

CREATE TABLE student_test(
    id INT PRIMARY KEY AUTO_INCREMENT,
    sno INT(8) ZEROFILL NOT NULL UNIQUE,
    sname VARCHAR(20) NOT NULL,
    sage INT CHECK(sage>=16 AND sage<=60),
    ssex VARCHAR(5) CHECK(ssex IN('男','女')),
    sdept VARCHAR(10) DEFAULT 'cs'
);
DROP TABLE student_test;
SELECT * FROM student_test;
INSERT INTO student_test(sno,sname,sage,ssex) VALUE(04151078,'黎濤',20,'男');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151079,'郗宇',21,'ccc','cs');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151080,'張晰',19,'女','is');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151081,'王偉',70,'男','is');

/創(chuàng)建日志表信息對(duì)表操作完成后觸發(fā)寫進(jìn)日志表/

CREATE TABLE text_log(
    id INT PRIMARY KEY AUTO_INCREMENT, 
    opra_table VARCHAR(20) NOT NULL,
    opra_type VARCHAR(20) NOT NULL,
    opra_remark VARCHAR(20)
);

/創(chuàng)建student表插入的觸發(fā)器/

CREATE TRIGGER trigger_insert_student AFTER INSERT ON student FOR EACH ROW 
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','insert','插入');

/刪除觸發(fā)器pro_insert_student/

DROP TRIGGER trigger_insert_student;

/創(chuàng)建student表刪除的觸發(fā)器/

CREATE TRIGGER trigger_delete_student AFTER DELETE ON student FOR EACH ROW 
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','delete','刪除');

/刪除觸發(fā)器pro_insert_student/

DROP TRIGGER trigger_delete_student;

/定義會(huì)話變量/

SET @sno_start=04151087;
SET @sno_end=04151095;

/查看會(huì)話變量/

SELECT @sno_start;
SELECT @sno_end;

/創(chuàng)建批插入的存儲(chǔ)過程,觸發(fā)插入操作對(duì)應(yīng)的觸發(fā)器/

DELIMITER $
CREATE PROCEDURE insert_student(IN sno_start INT, IN sno_end INT)
 BEGIN
    DECLARE i INT DEFAULT 0;
    SET i=sno_start;
    WHILE i<=sno_end DO
         INSERT INTO student(sno,sname,sage,ssex,sdept) 
        VALUE(i,'安雨軒',18+i-sno_start,'女','net');
         SET i=i+1;
    END WHILE;
 END 
$

/調(diào)用存儲(chǔ)過程,觸發(fā)插入操作對(duì)應(yīng)的觸發(fā)器/

CALL insert_student(@sno_start,@sno_end);

/創(chuàng)建批刪除的存儲(chǔ)過程,觸發(fā)刪除操作對(duì)應(yīng)的觸發(fā)器/

DELIMITER $
CREATE PROCEDURE delete_student(IN sno_start INT, IN sno_end INT)
 BEGIN
    DECLARE i INT DEFAULT 0;
    SET i=sno_start;
    WHILE i<=sno_end DO
         DELETE FROM student WHERE student.sno=i;
         SET i=i+1;
    END WHILE;
 END 
$

/調(diào)用存儲(chǔ)過程,觸發(fā)刪除操作對(duì)應(yīng)的觸發(fā)器/

CALL delete_student(@sno_start,@sno_end);

/創(chuàng)建一個(gè)觸發(fā)器,在對(duì)student_test表進(jìn)行insert delete update 時(shí)觸發(fā)日志信息更新,以及查詢student_test表/

CREATE TRIGGER trigger_update_stuTest_to_select AFTER UPDATE ON student_test FOR EACH ROW 
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student_test','update','修改');

/更新student_test表的信息,觸發(fā)student_test的更新觸發(fā)器/

UPDATE student_test SET student_test.ssex='男' WHERE student_test.sno=04151079;

/查詢student_test表/

SELECT * FROM student_test;

修改前:

image.png

image.png

修改后:
image.png

image.png

/查詢student表的數(shù)據(jù)添加情況/

SELECT * FROM student;

/查詢text_log表的數(shù)據(jù)更新情況/

SELECT * FROM text_log;

image.png

/查詢student表的數(shù)據(jù)添加情況/

SELECT * FROM student;

image.png

/查詢text_log表的數(shù)據(jù)更新情況/

SELECT * FROM text_log;
image.png
DROP PROCEDURE insert_student;
DROP TABLE text_log;

存儲(chǔ)過程:

(1)/查詢網(wǎng)絡(luò)工程系年齡不大于20的學(xué)生的信息/
/定義會(huì)話變量進(jìn)行值得傳遞/

SET @dept='net';
SET @age=21;
DELIMITER $
CREATE PROCEDURE select_sdept_sage(IN dept VARCHAR(10),IN age INT)
BEGIN 
    SELECT * FROM student WHERE student.sage<=age AND 
student.sdept=dept; 
END     
$ 
CALL select_sdept_sage(@dept,@age);

image.png

觸發(fā)器:
(1)/創(chuàng)建student表插入的觸發(fā)器/

CREATE TRIGGER trigger_insert_student_test  AFTER INSERT ON student_test FOR EACH ROW
 INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','insert','插入');

/*刪除觸發(fā)器pro_insert_student_test */

DROP TRIGGER trigger_insert_student_test ;

插入數(shù)據(jù):

INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151084,'張發(fā)',18,'女','is');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151085,'程里',19,'男','is');

插入前:
student_test:


image.png

text_log:

image.png

插入后:
student_test
image.png

text_log
image.png

(2)/創(chuàng)建student表刪除的觸發(fā)器/

CREATE TRIGGER trigger_delete_student_test  AFTER DELETE ON student_test  FOR EACH ROW
 INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','delete','刪除');

/*刪除觸發(fā)器pro_insert_student_test */

DROP TRIGGER trigger_delete_student_test ;

/刪除語句/

DELETE FROM student_test WHERE student_test.sno=04151079;

刪除前:
student_test:

image.png

text_log:
image.png

刪除后:
student_test:
image.png

text_log:
image.png

(3)/創(chuàng)建一個(gè)觸發(fā)器,在對(duì)student_test表進(jìn)行insert delete update 時(shí)觸 發(fā)日志信息更新,以及查詢student_test表/

CREATE TRIGGER trigger_update_stuTest_to_select AFTER UPDATE ON student_test FOR EACH ROW 
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student_test','update','修改');

/更新student_test表的信息,觸發(fā)student_test的更新觸發(fā)器/

UPDATE student_test SET student_test.ssex='女' WHERE student_test.sno=04151079;

更新前:

student_test:


image.png

text_log:


image.png

更新后:
student_test:
image.png

text_log:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容