1. 程式人生 > >關係型資料庫MySQL之觸發器和表資料操作

關係型資料庫MySQL之觸發器和表資料操作

一、觸發器(TRIGGER)

觸發器是MySQL的資料庫物件之一,該物件與程式語言中的函式非常類似,都需要申明、執行等。

1.1、 建立觸發器

1> 建立有一條執行語句的觸發器

建立觸發器通過SQL語句CREATE TRIGGER 來實現,其語法形式如下:

Create trigger trigger_name
        BEFORE|AFTTER trigger_EVENT
            ON TABLE_NAME FOR EACH ROW trigger_STMT;

解釋:trigger_name引數表示所要建立的觸發器名字,在具體建立觸發器時,觸發器識別符號不能與已存在的觸發器重複,建議觸發器的名字命名為trigger_XXX或者tri_XXX;BEFORE和AFTER引數指定了觸發器執行時間,其中前者是指在觸發器事件之前執行觸發器語句,後者是指在觸發器事件之後執行觸發器語句; trigger_EVENT表示觸發事件,即觸發器執行條件,包含DELETE、INSERT、UPDATE語句;TABLE_NAME引數表示觸發事件操作表的名字;FOR EACH ROW 引數表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器;trigger_STMT引數表示啟用觸發器後被執行的語句。

Create table t_diary(diaryno int,tablename varchar(20),diarytime datetime);
CREATE TABLE `t_dept` (
  `loc` varchar(40) DEFAULT NULL,
  `dname` varchar(20) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

eg:create trigger tri_diarytime
        Before insert on t_dept for
each row Insert into t_diary values(NULL,’t_dept’,now());
##該觸發器當向t_dept表中插入任意一條資料時,就會在插入之前向表t_diary中插入當前時間。 Insert into t_dept values (’haidian’,’caiwudept’,1); Select * from t_diary;

2> 建立包含多條執行語句的觸發器

語法形式如下:

Create trigger trigger_name
            Before|after trigger_EVENT
              ON
table_name for each row BEGIN Trigger_STMT END;

在mysql中,一般使用“;”符號作為語句的結束符號,可是在建立觸發器時需要用到“;”符號作為語句的結束符號。為了解決這個問題,可以使用關鍵字delimiter語句,例如:“DELIMITER $$”,可以用來實現將結束符號設定成“$$”。

eg:DELIMITER $$
	   CREATE TRIGGER tri_diarytime2
			AFTER INSERT 
				ON t_dept for each row
					Begin
						Insert into t_diary values(NULL,’t_dept’,now());
						Insert into t_diary values(NULL,’t_dept’,now());
					End
					$$

    DELIMITER ;

上述語句中,通過“DELEMITER $$”語句設定結束符號為“$$”;然後在BEGIN和END之間編寫了執行語句列表,最後通過“DELEMITER ;”語句將結束符號還原成預設結束符號“;”。

Insert into t_dept values(‘chaoyang’,’xinxi’20);

Select * from t_diary;

1.2、 檢視觸發器

1> 通過show triggers語句檢視觸發器

定義好觸發器之後,可以使用:

show triggers\G

檢視觸發器的詳細信。

2> 也可通過檢視系統表triggers實現檢視觸發器

在資料庫Information_schema中可使用如下語句檢視觸發器:

Use Information_schema;

Desc triggers;

注意:刪除t_dept表時所建立的觸發器將不復存在,建立觸發器時要寫正確名字,不能有中文符號。

1.3、 刪除觸發器

MySQL5.5中刪除觸發器使用drop trigger語句:

Eg:drop trigger tri_diarytime;

Show triggers \G

二、表資料操作

表資料操作此次主要是對插入、更改、刪除(insert、update、delete)這三個方面進行簡單的操作。

2.1插入資料

  • 插入完整資料記錄
  • 插入資料記錄一部分
  • 插入多條資料記錄
  • 插入查詢結果

補充:建完表後設置表的欄位主鍵約束和自動增加:

alter table t_dept add primary key auto_increment(deptno);

建完表後設置表的欄位為預設值:

alter table t_dept alter column deptno 
    set default 10;

2.1.1插入完整資料記錄

插入完成記錄通過insert into 語句來實現;語法如下:

INSERT INTO TAB_NAME(F1,F2,F3,F4,…Fn) 
        VALUES(V1,V2,V3,V4,…Vn);   #列名要和值一一對應
或者:INSERT INTO TAB_NAME         
        VALUES(V1,V2,V3,V4,…Vn);
eg: desc t_dept;
   insert into t_dept(loc,dname,deptno)
        values(‘beijing’,’orgino’,11);

2.1.2插入資料記錄一部分,語法如下:

INSERT INTO TAB_NAME(F1,F2,F3,F4,…Fn) 
VALUES(V1,V2,V3,V4,…Vn);   #列名要和值一一對應
eg: desc t_dept;
   insert into t_dept(dname,deptno) values(’services’,11);

2.1.3插入多條資料記錄

INSERT INTO TAB_NAME(F1,F2,F3,F4,…Fn) 
VALUES(V11,V12,V13,V14,…V1n),
            (V21,V22,V23,V24,…V2n),
(V31,V32,V33,V34,…V3n),
            (Vm1,Vm2,Vm3,Vm4,…Vmn); #列名要和值一一對應
或者:INSERT INTO TAB_NAME 
VALUES(V11,V12,V13,V14,…V1n),
            (V21,V22,V23,V24,…V2n),
(V31,V32,V33,V34,…V3n),
            (Vm1,Vm2,Vm3,Vm4,…Vmn); #列名要和值一一對應

eg:inset into t_dept
            values(‘haidian1’,’xinxi1’,1),
                 (‘haidian2’,’xinxi2’,2),
                 (‘haidian3’,’xinxi3’,3),
                 (‘haidian4’,’xinxi4’,4);
Select * from t_dept;

2.1.4插入查詢結果

通過檢視幫助文件還可以使用查詢結果插入到表中,具體語法結構如下:

INSERT INTO Tab_name1(F1,F2,…Fn)
        Select (F1,F2,…Fn)
            From tab_name2
                Where …
eg: create table t_loder(id int,name varchar(20),dname varchar(40),loc varchar(40));
insert into t_loder values(1,'gsau1','dept1','chaoyaang1');
insert into t_loder(id,name,dname) values(2,'gsau2','dept2');
insert into t_loder values(3,'gsau3','dept3','chaoyaang3');

insert into t_dept(loc,dname,deptno) 
        select loc,dname,id from t_loder;

2.2更新資料

更新資料包括更新特定資料記錄和更新所有資料記錄。

2.2.1更新特定資料使用update,具體語法如下:

UPDATE tab_name 
    SET f1=v1,f2=v2
        WHERE condition;
eg:update t_dept
        set loc=’lanzhou’
            where dname=’XINXI’;

2.2.2更新所有資料使用update,具體語法如下:

UPDATE tab_name 
    SET f1=v1,f2=v2,f3=v3
        WHERE condition;

在上述語句中,為了更新所有的資料記錄,引數condition需要滿足表tab_name中所有的資料記錄或者無關鍵字WHERE語句。

eg:update t_dept
        set loc=’lanzhou’
    where deptno<100;

eg:update t_dept
        set loc=’gansu’;

注意:要是某個欄位設定為主鍵唯一約束的話不能全部更新,不然會報錯ERROR 1062 (23000): Duplicate entry ‘10’ for key ‘PRIMARY*’!*

2.3刪除資料

刪除資料包括刪除特定資料記錄和和刪除所有記錄。

2.3.1刪除特定資料使用delete from,具體語法如下:

DELETE FROM tab_name
        WHERE condition;
eg:delete from t_dept 
    where dname=’dept1’;
      select * from t_dept;

2.3.2刪除所有資料使用delete from,具體語法如下:

DELETE FROM tab_name
        WHERE condition;

在上述語句中,為了刪除所有的資料記錄,引數condition需要滿足表tab_name中所有的資料記錄或者無關鍵字WHERE語句。

eg:delete from t_dept 
        where deptno<=60;
eg:delete from t_dept;  # 刪除整個表資料,但表結構依然存在
    select * from t_dept;

注意:使用delete刪除資料,但表結構依然存在,truncate也是刪除資料結構依然存在,drop刪除整個表包括結構。

三者區別具體如下所述:

程度從強到弱

1、drop  table tab_name;
drop將表格直接刪除,沒有辦法找回
2、truncate (table) tab_name;
刪除表中的所有資料,不能與where一起使用
3、delete from tab_name (where)
*刪除表中的資料(可制定某一行)*

兩者區別:truncate和delete的區別:

1、事務:truncate是不可以rollback的,但是delete是可以rollback的;原因:truncate刪除整表資料(ddl語句,隱式提交),delete是一行一行的刪除,可以rollback;

2、效果:truncate刪除後將重新水平線和索引(id從零開始) ,delete不會刪除索引;

3、truncate 不能觸發任何Delete觸發器;

4、delete 刪除可以返回行數.