MySQL中利用外鍵實現級聯刪除、更新


MySQL中利用外鍵實現級聯刪除、更新

MySQL支持外鍵的存儲引擎只有InnoDB,在創建外鍵的時候,要求父表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引。在創建索引的時候,可以指定在刪除、更新父表時,對子表進行的相應操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。其中RESTRICT和NO ACTION相同,是指在子表有關聯記錄的情況下父表不能更新;CASCADE表示父表在更新或者刪除時,更新或者刪除子表對應記錄;SET NULL則是表示父表在更新或者刪除的時候,子表的對應字段被SET NULL。

因為只有InnoDB引擎才允許使用外鍵,所以,我們的數據表必須使用InnoDB引擎。我所使用的版本是Mysql5.1版本的,過程如下:

創建數據庫

Create database test;

創建兩個表,其中第一個表的”id”是第二個表(userinfo)的外鍵:

CREATE TABLE `t_user` (

  `user_id` int(4) primary key,

  `role_name`varchar(20),

    'login_name' varchar(20),

    'login_pwd' varchar(20),

    'user_name' varchar(20),

    'creat_time' date

   PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

CREATE TABLE `userinfo` (

  `sn` int(4) NOT NULL AUTO_INCREMENT,

  `userid` int(4) NOT NULL,

  `info` varchar(20) DEFAULT NULL,

  PRIMARY KEY (`sn`),

  KEY `userid` (`userid`),

  CONSTRAINT `userinfo_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

注意: 
1、存儲引擎必須使用InnoDB引擎; 
2、外鍵必須建立索引; 
3、外鍵綁定關系這里使用了“ ON DELETE CASCADE ” “ON UPDATE CASCADE”,意思是如果外鍵對應數據被刪除或者更新時,將關聯數據完全刪除或者相應地更新。更多信息請參考MySQL手冊中關於InnoDB的文檔; 

好,接着我們再來插入數據測試:

INSERT INTO `user` (`id`,`sex`)
  VALUES ('1', 'f'),  ('2', 'm'), ('3', 'f');


INSERT INTO `userinfo` (`sn`,`userid`,`info`)
  VALUES  ('1', '1', '2005054dsf'),
              ('2', '1', 'fdsfewfdsfds'),
              ('3', '1', 'gdsgergergrtre'),
              ('4', '2', 'et34t5435435werwe'),
              ('5', '2', '435rtgtrhfghfg'),
             ('6', '2', 'ret345tr4345'),
            ('7', '3', 'fgbdfvbcbfdgr'),
             ('8', '3', '45r2343234were'),
             ('9', '3', 'wfyhtyjtyjyjy');

我們先看一下當前數據表的狀態:

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| user           |

| userinfo       |

+----------------+

2 rows in set (0.00 sec)

User表中的數據:
mysql> select * from user;

+----+------+

| id | sex  |

+----+------+

|  1 | f    |

|  2 | m    |

|  3 | f    |

+----+------+

3 rows in set (0.00 sec)

Userinfo表中的數據:

mysql> select * from userinfo;

+----+--------+-------------------+

| sn | userid | info              |

+----+--------+-------------------+

|  1 |      1 | 2005054dsf        |

|  2 |      1 | fdsfewfdsfds      |

|  3 |      1 | gdsgergergrtre    |

|  4 |      2 | et34t5435435werwe |

|  5 |      2 | 435rtgtrhfghfg    |

|  6 |      2 | ret345tr4345      |

|  7 |      3 | fgbdfvbcbfdgr     |

|  8 |      3 | 45r2343234were    |

|  9 |      3 | wfyhtyjtyjyjy     |

+----+--------+-------------------+

9 rows in set (0.00 sec)

對於建立以上不表,相信對大家也沒什么難度了。好的,下面我們就要試驗我們的級聯刪除功能了。 
  我們將刪除user表中id為2的數據記錄,看看userinf表中userid為2的相關子紀錄是否會自動刪除:

執行刪除操作成功!

mysql> delete from `user` where `id`='2';

Query OK, 1 row affected (0.03 sec)

看看user表中已經沒有id為2的數據記錄了!

mysql> select * from user;

+----+------+

| id | sex  |

+----+------+

|  1 | f    |

|  3 | f    |

+----+------+

2 rows in set (0.00 sec)

再看看userinfo表中已經沒有userid為2的3條數據記錄了,對應數據確實自動刪除了!

mysql> select * from userinfo;

+----+--------+----------------+

| sn | userid | info           |

+----+--------+----------------+

|  1 |      1 | 2005054dsf     |

|  2 |      1 | fdsfewfdsfds   |

|  3 |      1 | gdsgergergrtre |

|  7 |      3 | fgbdfvbcbfdgr  |

|  8 |      3 | 45r2343234were |

|  9 |      3 | wfyhtyjtyjyjy  |

+----+--------+----------------+

6 rows in set (0.00 sec)

更新的操作也類似,因為我們在前面建表的時候已經定義外鍵刪除、更新操作都是CASCADE,所以在這里可以直接測試數據。

將user表中原來id為1的數據記錄更改為id為4,執行如下:

mysql> update user set id=4 where id='1';

Query OK, 1 row affected (0.03 sec)

Rows matched: 1  Changed: 1  Warnings: 0

現在去看看兩個表中是數據是否發生了變化:

mysql> select * from user;

+----+------+

| id | sex  |

+----+------+

|  3 | f    |

|  4 | f    |

+----+------+

2 rows in set (0.00 sec)

 

mysql> select * from userinfo;

+----+--------+----------------+

| sn | userid | info           |

+----+--------+----------------+

|  1 |      4 | 2005054dsf     |

|  2 |      4 | fdsfewfdsfds   |

|  3 |      4 | gdsgergergrtre |

|  7 |      3 | fgbdfvbcbfdgr  |

|  8 |      3 | 45r2343234were |

|  9 |      3 | wfyhtyjtyjyjy  |

+----+--------+----------------+

6 rows in set (0.00 sec)

    比較原來的表可以發現它們的確已經更新成功了,測試完成!!!這也就實現了用外鍵對多個相關聯的表做同時刪除、更新的操作,從而保證了數據的一致性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM