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...