隨筆-9  評(píng)論-168  文章-266  trackbacks-0
          首先,目前在產(chǎn)品環(huán)境可用的MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允許使用外鍵,所以,我們的數(shù)據(jù)表必須使用InnoDB引擎。

          下面,我們先創(chuàng)建以下測試用數(shù)據(jù)庫表:


          CREATE TABLE `roottb` (
            `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
            `data` VARCHAR(100) NOT NULL DEFAULT '',
            PRIMARY KEY (`id`)
          ) TYPE=InnoDB;

          CREATE TABLE `subtb` (
            `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
            `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
            `data` VARCHAR(100) NOT NULL DEFAULT '',
            PRIMARY KEY (`id`),
            INDEX (`rootid`),
            FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE
          ) TYPE=InnoDB;


          注意:
          1、必須使用InnoDB引擎;
          2、外鍵必須建立索引(INDEX);
          3、外鍵綁定關(guān)系這里使用了“ ON DELETE CASCADE”,意思是如果外鍵對(duì)應(yīng)數(shù)據(jù)被刪除,將關(guān)聯(lián)數(shù)據(jù)完全刪除,更多信息請(qǐng)參考MySQL手冊(cè)中關(guān)于InnoDB的文檔;

          好,接著我們?cè)賮聿迦霚y試數(shù)據(jù):


          INSERT INTO `roottb` (`id`,`data`)
            VALUES ('1', 'test root line 1'),
                   ('2', 'test root line 2'),
                   ('3', 'test root line 3');

          INSERT INTO `subtb` (`id`,`rootid`,`data`)
            VALUES ('1', '1', 'test sub line 1 for root 1'),
                   ('2', '1', 'test sub line 2 for root 1'),
                   ('3', '1', 'test sub line 3 for root 1'),
                   ('4', '2', 'test sub line 1 for root 2'),
                   ('5', '2', 'test sub line 2 for root 2'),
                   ('6', '2', 'test sub line 3 for root 2'),
                   ('7', '3', 'test sub line 1 for root 3'),
                   ('8', '3', 'test sub line 2 for root 3'),
                   ('9', '3', 'test sub line 3 for root 3');
            

          我們先看一下當(dāng)前數(shù)據(jù)表的狀態(tài):


          mysql>; show tables;
          +----------------+
          | Tables_in_test |
          +----------------+
          | roottb         |
          | subtb          |
          +----------------+
          2 rows in set (0.00 sec)

          mysql>; select * from `roottb`;
          +----+------------------+
          | id | data             |
          +----+------------------+
          |  1 | test root line 1 |
          |  2 | test root line 2 |
          |  3 | test root line 3 |
          +----+------------------+
          3 rows in set (0.05 sec)

          mysql>; select * from `subtb`;
          +----+--------+----------------------------+
          | id | rootid | data                       |
          +----+--------+----------------------------+
          |  1 |      1 | test sub line 1 for root 1 |
          |  2 |      1 | test sub line 2 for root 1 |
          |  3 |      1 | test sub line 3 for root 1 |
          |  4 |      2 | test sub line 1 for root 2 |
          |  5 |      2 | test sub line 2 for root 2 |
          |  6 |      2 | test sub line 3 for root 2 |
          |  7 |      3 | test sub line 1 for root 3 |
          |  8 |      3 | test sub line 2 for root 3 |
          |  9 |      3 | test sub line 3 for root 3 |
          +----+--------+----------------------------+
          9 rows in set (0.01 sec)


          嗯,一切都正常,好,下面我們要試驗(yàn)我們的級(jí)聯(lián)刪除功能了。

          我們將只刪除roottb表中id為2的數(shù)據(jù)記錄,看看subtb表中rootid為2的相關(guān)子紀(jì)錄是否會(huì)自動(dòng)刪除:


          mysql>; delete from `roottb` where `id`='2';
          Query OK, 1 row affected (0.03 sec)

          mysql>; select * from `roottb`;
          +----+------------------+
          | id | data             |
          +----+------------------+
          |  1 | test root line 1 |
          |  3 | test root line 3 |
          +----+------------------+
          2 rows in set (0.00 sec)

          mysql>; select * from `subtb`;
          +----+--------+----------------------------+
          | id | rootid | data                       |
          +----+--------+----------------------------+
          |  1 |      1 | test sub line 1 for root 1 |
          |  2 |      1 | test sub line 2 for root 1 |
          |  3 |      1 | test sub line 3 for root 1 |
          |  7 |      3 | test sub line 1 for root 3 |
          |  8 |      3 | test sub line 2 for root 3 |
          |  9 |      3 | test sub line 3 for root 3 |
          +----+--------+----------------------------+
          6 rows in set (0.01 sec)


          嗯,看subtb表中對(duì)應(yīng)數(shù)據(jù)確實(shí)自動(dòng)刪除了,測試成功。

          結(jié)論:在MySQL中利用外鍵實(shí)現(xiàn)級(jí)聯(lián)刪除成功!

                                                                              -----------轉(zhuǎn)帖:http://www.chinaunix.net/jh/17/462977.html
          posted on 2008-04-07 12:00 紫蝶∏飛揚(yáng)↗ 閱讀(399) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
          主站蜘蛛池模板: 抚州市| 镶黄旗| 澄城县| 湛江市| 东城区| 离岛区| 布尔津县| 中江县| 肥东县| 红桥区| 巍山| 阿尔山市| 紫阳县| 沈阳市| 封丘县| 延川县| 秦皇岛市| 上高县| 永兴县| 简阳市| 德格县| 潜江市| 宝丰县| 庆云县| 罗山县| 璧山县| 瑞安市| 德惠市| 柏乡县| 合山市| 通州区| 西峡县| 三明市| 门源| 邵武市| 宿松县| 澄江县| 竹溪县| 布拖县| 博湖县| 肃南|