日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MariaDB 视图与触发器(11)

發布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MariaDB 视图与触发器(11) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于現在閉源了,而能輕松成為MySQL的代替品.在存儲引擎方面,使用XtraDB來代替MySQL的InnoDB,MariaDB由MySQL的創始人Michael Widenius主導開發,他早前曾以10億美元的價格,將自己創建的公司MySQL AB賣給了SUN,此后,隨著SUN被甲骨文收購MySQL的所有權也落入Oracle的手中.MariaDB名稱來自MichaelWidenius的女兒Maria的名字.

數據庫中的視圖是一個虛擬表,同真實的表一樣,視圖包含一系列帶有名稱的行和列數據,行和列數據來自由定義視圖查詢所引用的表,并且在引用視圖時動態生成,視圖是從一個或者多個表中導出的,視圖的行為與表非常相似,但視圖是一個虛擬表.在視圖中用戶可以使用SELECT語句查詢數據,以及使用INSERT、UPDATE和DELETE修改記錄,視圖可以使用戶操作方便,而且可以保障數據庫系統的安全.

觸發器和存儲過程一樣,都是嵌入到MySQL的一段程序,觸發器是由事件來觸發某個操作,這些事件包括INSERT、UPDATAE和DELETE語句.如果定義了觸發程序,當數據庫執行這些語句的時候就會激發觸發器執行相應的操作,觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象.

MariaDB 視圖

視圖的含義:

視圖是一張虛擬表,是從數據庫中一個或多個表中導出來的表,視圖還可以從已經存在的視圖基礎上定義,視圖一經定義便存儲在數據庫中,與其相對應的數據并沒有像表那樣在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據.對視圖的操作與對表的操作一樣,可以對其進行查詢、修改和刪除.當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化.同時,若基本表的數據發生變化,則這種變化也可以自動地反映到視圖中.

如下小例子:下面有個student表和 info表,現在我分別只想去除其中的ID號,姓名,班級,此時我們就需要用一個視圖來解決,取出指定的字段.

create table student (s_id int,name varchar(40)); create table info (s_id int,glass varchar(40),addr varchar(90));

視圖提供了一個很好的解決方法,創建視圖的信息來自表的部分信息,只取出需要的信息,這樣既能滿足需求也不破壞原有的表結構.

視圖的作用:

視圖不僅可以簡化用戶對于數據的理解,也可以簡化他們的操作,那些被經常使用的查詢可以定義為視圖,從而使得用戶不必為以后的操作每次指定全部條件.

通過視圖用戶只能查詢和修改他們所能見到的數據,數據庫中的其他數據則既看不見也取不到,數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定的列上.通過視圖,用戶可以被限制在數據的不同子集上.

◆創建視圖◆

在單表上創建視圖:

1.首先創建一個基本表table1并插入測試數據.

MariaDB [lyshark]> create table table1(quantity INT,price INT); Query OK, 0 rows affected (0.02 sec)MariaDB [lyshark]> insert into table1 values(1,10); Query OK, 1 row affected (0.00 sec)MariaDB [lyshark]> insert into table1 values(2,30); Query OK, 1 row affected (0.00 sec)MariaDB [lyshark]> insert into table1 values(3,50); Query OK, 1 row affected (0.00 sec)

2.創建視圖,在table1表上創建一個view_tab1視圖,其中代碼有三個字段x,y,totle,SQL語句如下:

MariaDB [lyshark]> create view view_tab1(x,y,totle)-> AS SELECT quantity,price,quantity * price-> FROM table1; Query OK, 0 rows affected (0.00 sec)

3.緊接著我們使用視圖來查詢創建的新表格.

MariaDB [lyshark]> select * from view_tab1; +------+------+-------+ | x | y | totle | +------+------+-------+ | 1 | 10 | 10 | | 2 | 30 | 60 | | 3 | 50 | 150 | +------+------+-------+ 3 rows in set (0.00 sec)

在多張表上創建視圖:

1.首先創建兩個測試表并插入一些數據,這里我們就創建要給student和info兩個表,SQL語句如下:

MariaDB [lyshark]> create table student-> (-> s_id INT,-> name VARCHAR(40)-> ); Query OK, 0 rows affected (0.01 sec)MariaDB [lyshark]> create table info-> (-> s_id INT,-> glass VARCHAR(40),-> addr VARCHAR(90)-> ); Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> insert into student values(1,'wang'),(2,'rui'); Query OK, 2 rows affected (0.33 sec) Records: 2 Duplicates: 0 Warnings: 0MariaDB [lyshark]> insert into info values(1,'wuban','henan'),(2,'sanban','hebei'),(3,'yiban','s handong'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0

2.接下來我們創建一個視圖stu_glass,其中有三個參數(id,name,glass),分別對應兩個表的不同字段,并且通過where條件限定ID號相同的關聯在一起.

MariaDB [lyshark]> create view stu_glass(id,name,glass)-> AS select student.s_id,student.name,info.glass-> FROM student,info where student.s_id = info.s_id;Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> select * from stu_glass; +------+------+--------+ | id | name | glass | +------+------+--------+ | 1 | wang | wuban | | 2 | rui | sanban | +------+------+--------+ 2 rows in set (0.01 sec)

以上例子就解決了剛開始那個問題,通過這個視圖可以很好地保護基本表中的數據.

◆查看視圖◆

使用desc查看視圖表結構:

MariaDB [lyshark]> desc stu_glass; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(40) | YES | | NULL | | | glass | varchar(40) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)

使用show table status查看視圖:

MariaDB [lyshark]> show table status like 'stu_glass' \G *************************** 1. row ***************************Name: stu_glassEngine: NULLVersion: NULLRow_format: NULLRows: NULLAvg_row_length: NULLData_length: NULL Max_data_length: NULLIndex_length: NULLData_free: NULLAuto_increment: NULLCreate_time: NULLUpdate_time: NULLCheck_time: NULLCollation: NULLChecksum: NULLCreate_options: NULLComment: VIEW 1 row in set (0.00 sec)

使用show create view查看視圖詳細信息:

MariaDB [lyshark]> show create view stu_glass \G *************************** 1. row ***************************View: stu_glassCreate View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_glass` AS select `student`.`s_id` AS `id`,`student`.`name` AS `name`,`info`.`glass` AS `glass` from (`student` join `info`) where (`student`.`s_id` = `info`.`s_id`) character_set_client: utf8 collation_connection: utf8_general_ci 1 row in set (0.00 sec)MariaDB [lyshark]>

在views表中查看視圖詳細信息:

MariaDB [lyshark]> select * from information_schema.views; #查視圖 MariaDB [lyshark]> select * from information_schema.tables; #查表 +---------------+--------------+------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | +---------------+--------------+------------+ | def | lyshark | stu_glass | | def | lyshark | view_tab1 | | def | lyshark | view_tab2 | +---------------+--------------+------------+ 3 rows in set (0.01 sec)


◆更新與刪除視圖◆

alter語句修改視圖:

使用alter語句,修改視圖view_tab1,SQL語句如下:

MariaDB [lyshark]> desc view_tab1; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | x | int(11) | YES | | NULL | | | y | int(11) | YES | | NULL | | | totle | bigint(21) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)MariaDB [lyshark]> alter view view_tab1-> AS select quantity from table1; Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> desc view_tab1; +----------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+---------+------+-----+---------+-------+ | quantity | int(11) | YES | | NULL | | +----------+---------+------+-----+---------+-------+ 1 row in set (0.00 sec)

update更新視圖:

MariaDB [lyshark]> select * from stu_glass; +------+------+--------+ | id | name | glass | +------+------+--------+ | 1 | wang | wuban | | 2 | rui | sanban | +------+------+--------+ 2 rows in set (0.00 sec)MariaDB [lyshark]> update stu_glass SET id=3 where name="rui"; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0MariaDB [lyshark]> select * from stu_glass; +------+------+-------+ | id | name | glass | +------+------+-------+ | 1 | wang | wuban | | 3 | rui | yiban | +------+------+-------+ 2 rows in set (0.00 sec)

刪除視圖中指定字段:注意,聯合字段的視圖無法刪除.

MariaDB [lyshark]> select * from view_tab1; +------+------+-------+ | x | y | totle | +------+------+-------+ | 1 | 10 | 10 | | 2 | 30 | 60 | | 3 | 50 | 150 | +------+------+-------+ 3 rows in set (0.00 sec)MariaDB [lyshark]> delete from view_tab1 where x=1; Query OK, 1 row affected (0.00 sec)MariaDB [lyshark]> select * from view_tab1; +------+------+-------+ | x | y | totle | +------+------+-------+ | 2 | 30 | 60 | | 3 | 50 | 150 | +------+------+-------+ 2 rows in set (0.00 sec)

刪除一個視圖:

1.查詢一下,我們比如要刪除view_tab1和view_tab2兩個視圖.

MariaDB [lyshark]> select * from information_schema.views; #查視圖 +---------------+--------------+------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | +---------------+--------------+------------+ | def | lyshark | stu_glass | | def | lyshark | view_tab1 | | def | lyshark | view_tab2 | +---------------+--------------+------------+ 3 rows in set (0.01 sec)

2.通過drop view語句直接刪除掉.

MariaDB [lyshark]> drop view if exists view_tab1; Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> drop view if exists view_tab2; Query OK, 0 rows affected (0.00 sec)

3.再次查詢,發現沒有了,刪除成功.

MariaDB [lyshark]> select * from information_schema.views; +---------------+--------------+------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | +---------------+--------------+------------+ | def | lyshark | stu_glass | +---------------+--------------+------------+ 1 row in set (0.00 sec)


MariaDB觸發器

觸發器(Trigger)是個特殊的存儲過程,不同的是,執行存儲過程要使用CALL語句來調用,而觸發器的執行不需要使用CALL語句來調用,也不需要手工啟動,只要當一個預定義的事件發生的時候,就會被MySQL自動調用,觸發器可以查詢其他表,而且可以包含復雜的SQL語句,它們主要用于滿足復雜的業務規則或要求.

一般來說創建觸發器的基本語法如下:

create trigger trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt#---------------------------------------------------------------- #[參數解釋]trigger_name #觸發器名稱 trigger_time #標識觸發時機(befor/after) trigger_event #標識觸發事件 table_name #建立觸發器表名,即在那張表上建立觸發器 trigger_stmt #觸發器執行語句

而創建多個執行語句的觸發器的語法如下:

create trigger trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN 執行語句塊... END

◆創建觸發器◆

創建只有一條執行語句的觸發器:

1.首先創建一個account表,表中有兩個字段,分別是acct_num字段(INT),amount字段(float).

MariaDB [lyshark]> create table account(acct_num INT,amount DECIMAL(10,2)); Query OK, 0 rows affected (0.01 sec)MariaDB [lyshark]> desc account; +----------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+---------------+------+-----+---------+-------+ | acct_num | int(11) | YES | | NULL | | | amount | decimal(10,2) | YES | | NULL | | +----------+---------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)

2.創建一個名為ins_sum的觸發器,觸發條件是向數據表account插入數據之前,對新插入的amount字段值進行求和計算.

MariaDB [lyshark]> create trigger ins_sum BEFORE INSERT ON account-> FOR EACH ROW SET @sum=@sum+NEW.amount; Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> set @sum=0; Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> insert into account values(1,1.00),(2,2.00); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0MariaDB [lyshark]> select @sum; +------+ | @sum | +------+ | 3.00 | +------+ 1 row in set (0.00 sec)

以上例子,首先創建一個account表,再向表account插入數據之前,計算所有新插入的account表的amount值之和,觸發器的名稱為ins_sum,條件是在向表中插入數據之前觸發.

創建具有多條執行語句的觸發器:

1.首相創建4個測試表格,并寫入以下測試字段.

MariaDB [lyshark]> create table test1(a1 INT); Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> create table test2(a2 INT); Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> create table test3(a3 INT NOT NULL AUTO_INCREMENT primary key); Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> create table test4(-> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,-> b4 INT DEFAULT 0-> ); Query OK, 0 rows affected (0.07 sec)

2.創建一個包含多個執行語句的觸發器,當test1有數據插入時,執行觸發語句,代碼如下:

MariaDB [lyshark]> DELIMITER // MariaDB [lyshark]> create trigger testref BEFORE INSERT ON test1-> FOR EACH ROW-> BEGIN-> insert into test2 set a2=NEW.a1;-> delete from test3 where a3=NEW.a1;-> update test4 set b4=b4+1 where a4=NEW.a1;-> END-> // MariaDB [lyshark]> DELIMITER ;;

以上代碼創建了一個名為testref的觸發器,這個觸發器的觸發條件是在向表test1插入數據前執行觸發器的語句,具體執行代碼如下:

MariaDB [lyshark]> insert into test1 values (1),(3),(1),(7),(1),(4); Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0

當test1表格插入數據后,其他表格也會出現相同的數據,這就是觸發器所做的貢獻.

MariaDB [lyshark]> select * from test1; +------+ | a1 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 4 | +------+ 6 rows in set (0.00 sec)MariaDB [lyshark]> select * from test2; +------+ | a2 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 4 | +------+ 6 rows in set (0.00 sec)

關于觸發器的另一個小實驗:

1.先來創建一個數據表.

MariaDB [lyshark]> create table myevent(id int,name char(20)); Query OK, 0 rows affected (0.01 sec)MariaDB [lyshark]> desc myevent; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(20) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec)

2.創建一個trig_insert的觸發器,在向表account插入數據之后會向表myevent插入一組數據,代碼如下:

MariaDB [lyshark]> create trigger trig_insert AFTER INSERT ON account-> FOR EACH ROW INSERT INTO myevent values(2,'after insert'); Query OK, 0 rows affected (0.00 sec)

3.此時我們執行插入語句,向account表插入數據,查詢myevent表,發現自動添加上了,說明觸發器生效了.

MariaDB [lyshark]> insert into account values(1,1.00),(2,2.00); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0MariaDB [lyshark]> select * from myevent; +------+--------------+ | id | name | +------+--------------+ | 2 | after insert | | 2 | after insert | +------+--------------+ 2 rows in set (0.00 sec)

◆查看與刪除觸發器◆

show triggers 查看所有觸發器:

MariaDB [lyshark]> show triggers \G; *************************** 1. row ***************************Trigger: ins_sumEvent: INSERTTable: accountStatement: SET @sum=@sum+NEW.amountTiming: BEFORECreated: NULLsql_mode:Definer: root@localhost character_set_client: utf8 collation_connection: utf8_general_ciDatabase Collation: latin1_swedish_ci *************************** 2. row ***************************Trigger: trig_insertEvent: INSERTTable: accountStatement: INSERT INTO myevent values(2,'after insert')Timing: AFTERCreated: NULLsql_mode:Definer: root@localhost character_set_client: utf8 collation_connection: utf8_general_ciDatabase Collation: latin1_swedish_ci

在triggers表中查看觸發器:

MariaDB [lyshark]> select * from information_schema.triggers \G;*************************** 1. row ***************************TRIGGER_CATALOG: defTRIGGER_SCHEMA: lysharkTRIGGER_NAME: ins_sumEVENT_MANIPULATION: INSERTEVENT_OBJECT_CATALOG: defEVENT_OBJECT_SCHEMA: lysharkEVENT_OBJECT_TABLE: accountACTION_ORDER: 0ACTION_CONDITION: NULLACTION_STATEMENT: SET @sum=@sum+NEW.amountACTION_ORIENTATION: ROWACTION_TIMING: BEFORE ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULLACTION_REFERENCE_OLD_ROW: OLDACTION_REFERENCE_NEW_ROW: NEWCREATED: NULLSQL_MODE:DEFINER: root@localhostCHARACTER_SET_CLIENT: utf8COLLATION_CONNECTION: utf8_general_ciDATABASE_COLLATION: latin1_swedish_ci

刪除觸發器: 刪除lyshark數據庫中的,ins觸發器,SQL如下:

1.先查詢一下觸發器的名稱,SQL語句如下:

MariaDB [lyshark]> select TRIGGER_SCHEMA,TRIGGER_NAME from information_schema.triggers; +----------------+--------------+ | TRIGGER_SCHEMA | TRIGGER_NAME | +----------------+--------------+ | lyshark | ins_sum | | lyshark | trig_insert | | lyshark | testref | +----------------+--------------+ 3 rows in set (0.00 sec)

2.一條命令刪除.

MariaDB [lyshark]> drop trigger lyshark.ins_sum; Query OK, 0 rows affected (0.00 sec)


轉載于:https://www.cnblogs.com/LyShark/p/10197881.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的MariaDB 视图与触发器(11)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。