mysql級聯更新的兩種方式 觸發器更新和外來鍵

2021-09-08 19:40:58 字數 2197 閱讀 2140

1.mysql級聯更新有兩種方式:觸發器更新和外來鍵更新.

2.觸發器更新和外來鍵更新的目的都是為了保證資料完整性。

我們通常有這樣的需求:刪除表table 1中記錄,需要同時刪除其它表中與table 1有關的若干記錄。

舉個例子:

現有2個實體- 麻將機 學生、課程,1種聯絡- 成績

分別建立 學生表 students, 課程表course,成績表score

--建立 學生表 students

create table if not exists `students` (

`id` int(11) not null auto_increment,

`name` varchar(32) default "",

primary key (`id`)

) engine=innodb;

--插入若干記錄

insert into `students` (`id`, `name`) values

(1, "john"),

(2, "lucy"),

(4, "jack");

--建立課程表

create table if not exists `course` (

`id` int(11) not null auto_increment,

`name` varchar(32) default "",

primary key (`id`)

) engine=innodb;

-- 插入資料若干

insert into `course` (`id`, `name`) values

(1, "english"),

(2, "chinese"),

(3, "math");

--建立成績表

--sid 學生id

--cid 課程id

create table if not exists `score` (

`sid` int(11) default "0",

`cid` int(11) default "0",

`score` float(6,2) default "0.00",

key `sid` (`sid`),

key `cid` (`cid`)

) engine=innodb;

--插入若干資料

insert into `score` (`sid`, `cid`, `score`) values

(1, 2, 95.00),

(1, 3, 65.00),

(2, 1, 77.00),

(2, 2, 68.50),

(2, 3, 89.00);

現在,我希望:

刪除students表記錄的同時,自動刪除成績表中該同學的記錄

刪除course表記錄的同時,自動刪除成績表中該課程的記錄

我想到的做法有二:

一,使用innodb表的外來鍵約束

alter table `score`

add constraint `student_ibfk1`

foreign key `sid`(`sid`) references `students` (`id`)

on delete cascade on update cascade;

這裡cascade作用就是在父表記錄更新或刪除時,子表更新或刪除相應的記錄

外來鍵約束的動作除了cascade,還有restrict(限制刪除)set null(設為空值,字段如果允許為空的話)等

外來鍵約束文件詳見:

二,使用觸發器trigger進行操作

由於外來鍵約束只能用於innodb型表,因些對於myisam型表還得用trigger來進行更新

--以下觸發器在刪除students後同時刪除表score中相關記錄

drop trigger if exists `deletescore`//

create trigger `deletescore` after delete on `students`

for each row begin

delete from score where sid=old.`id`;

end觸發器比較好理解,其中after是事件發生後,有的需求可能用before;事件型別有insert,replace,update,delete等

這裡的」//」是delimiter,用來標記觸發器開始與結束

MySQL 兩種登入方式

可以參考我的 mysql 用批處理指令碼bat快速啟動 關閉mysql 或者在計算機的服務那裡開啟,設為手動或自動 即開始選單的mysql5.5 command line client 登入 mysql h主機名 p埠號 u使用者名稱 p密碼 如mysql h localhost p 3306 u ...

MySQL的兩種安裝方式

安裝軟體前,檢查是否已經安裝 rpm qa grep mysql 存在,強制解除安裝 sudo rpm e mysql libs 5.1.71 1.el6.x86 64 nodeps 安裝mysql server sudo rpm ivh mysql community server 5.7.21 ...

連線Mysql的兩種方式

在宿主機連線mysql容器,使用低版本 1 拉取映象 docker pull centos mysql 56 centos7 2 啟動映象,指定埠 3316是宿主機的埠 docker run d e mysql user test e mysql password 123 e mysql datab...