phpMyAdmin 建立關聯式資料表 次要群組 [後端程設::PHP 眉角]
phpMyAdmin 建立關聯式資料表 次要群組 [後端程設::PHP 眉角]
資料來源:http://note.tc.edu.tw/267.html
phpMyAdmin 建立關聯式資料表
想用 phpMyAdmin 建立關聯式資料表一直不得其門而入,以前我就有學到 foreign key 的觀念,但是奇怪,console怎麼設都錯誤,而 phpMyAdmin 上也找不到選項,後來只好用程式來解決關聯的問題,這也是低等級程設師常做的事,繞過問題而不去花時間解決問題。至於什麼是關聯式資料庫,網路上很多理論說明,不再贅言。
後來經過瑩光兄一點,才恍然大悟,原來資料表的引擎要用 innoDB 才能建立關聯式資料表,怪不得我以前怎麼試都失敗 + +。以下是建立關聯式資料表的簡單範例及說明。
一、建立一個資料庫,例如 hades,在裡面建立兩個表。
這個是主要表,例如我現在建立一個身體部位的資料表,裡面的主鍵是 bID 格式 smallint(6) ,只要是具有唯一鍵性質的欄位,就可以被當成是 foregin key,例如主鍵、唯一鍵,而子表中的欄位只有主鍵、唯一鍵或是索引鍵可以和 foregin key建立關聯。
— 資料表格式: `bodyparts`
—
CREATE TABLE IF NOT EXISTS `bodyparts` (
`bID` smallint(6) NOT NULL auto_increment,
`bname` varchar(24) collate utf8_bin NOT NULL,
PRIMARY KEY (`bID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC AUTO_INCREMENT=7 ;
這是子表,他要和主表 `bodyparts` 建立關聯。如此當主表該筆foreign key 刪除時,子表有關聯到的欄位也要一併刪除,或是主表修改bID時,子表有關聯到的欄位`syndrome`.`bID`= `bodyparts`.`bID` 也要一併修改,以免久而久之遺留很多找不到關聯的垃圾記錄或是資料不同步。
—
— 資料表格式: `syndrome`
—
CREATE TABLE IF NOT EXISTS `syndrome` (
`sID` smallint(9) NOT NULL auto_increment,
…
`bID` smallint(9) NOT NULL,
PRIMARY KEY (`sID`),
KEY `bID` (`bID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC AUTO_INCREMENT=3 ;
二、在子資料表 `syndrome`建立關連到主表
ALTER TABLE `syndrome`
ADD CONSTRAINT `syndrome_ibfk_1` FOREIGN KEY (`bID`) REFERENCES `bodyparts` (`bID`) ON DELETE CASCADE ON UPDATE CASCADE;
觀察重點:子表上 bID 並不一定要唯一鍵,而『關聯檢視』的連結要innoDB引擎才會出現
點選「關聯檢視」後,將bID的foregin key指到: `bodyparts`(`bID`)。
後面兩個是當主表的 `bodyparts`(`bID`) 發生刪除或修改時,要採取的行為。其中有下列選項:
CASCADE 階層狀異動:主表刪子表就刪;主表修子表就修。
SET NULL 主表想要更動時(刪或修),子表將該欄位設為空值
NO ACTION 什麼都不做,那還建關聯幹嘛?
RESTRICT 這個玩意就是限制,當主表想要更動時(刪或修),子表有設為 RESTRICT,主表的更動會受到限制,產生錯誤
———–
本身實作後的結果
— phpMyAdmin SQL Dump
— version 4.0.4.2 — — 主機: localhost — 產生日期: 2016 年 01 月 04 日 02:05 — 伺服器版本: 5.6.13 — PHP 版本: 5.4.17 SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”; SET time_zone = “+00:00”; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; — — 資料庫: `test` — CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE `test`; — ——————————————————– — — 表的結構 `bodyparts` — CREATE TABLE IF NOT EXISTS `bodyparts` ( `bID` smallint(6) NOT NULL AUTO_INCREMENT, `bname` varchar(24) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`bID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ; — ——————————————————– — — 表的結構 `syndrome` — CREATE TABLE IF NOT EXISTS `syndrome` ( `sID` smallint(9) NOT NULL AUTO_INCREMENT, `bID` smallint(9) NOT NULL, PRIMARY KEY (`sID`), KEY `bID` (`bID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ; — — 匯出資料表的 Constraints — — — 資料表的 Constraints `syndrome` — ALTER TABLE `syndrome` ADD CONSTRAINT `syndrome_ibfk_1` FOREIGN KEY (`bID`) REFERENCES `bodyparts` (`bID`) ON DELETE CASCADE ON UPDATE CASCADE; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |