MySQL创建关联表可以理解为是两个表之间有个外键关系,但这两个表必须满足三个条件
1.两个表必须是InnoDB数据引擎
2.使用在外键关系的域必须为索引型(Index)
3.使用在外键关系的域必须与数据类型相似
下面分别建两个表来说明一下:
- Create TABLE IF NOT EXISTS `books` (
- `book_id` smallint(6) NOT NULL auto_increment COMMENT '书籍编号',
- `book_name` char(20) NOT NULL COMMENT '书名',
- `book_pic` varchar(200) NOT NULL COMMENT '封面',
- `book_author` char(20) NOT NULL COMMENT '作者',
- `book_pub` char(40) NOT NULL COMMENT '出版社',
- `book_sort` char(6) NOT NULL COMMENT '分类',
- `book_owner` char(6) default NULL COMMENT '所有者',
- `book_borrower` char(7) default NULL COMMENT '借阅者',
- `book_borrower_time` date default NULL COMMENT '借阅时间',
- PRIMARY KEY (`book_id`),
- INDEX (book_borrower))
- ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=5 ;
- Create TABLE IF NOT EXISTS `parts` (
- `part_id` smallint(6) NOT NULL COMMENT '成员编号',
- `part_name` varchar(6) NOT NULL COMMENT '成员名',
- `part_mail` varchar(50) NOT NULL COMMENT '邮箱',
- `part_pass` varchar(20) NOT NULL COMMENT '密码',
- PRIMARY KEY (`part_id`),
- FOREIGN KEY(part_name) REFERENCES books(book_borrower) on delete cascade on update cascade)
- ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
分析一下books表和parts表,创建他们的关联,我用了books表的book_borrower字段 创建表时索引并选择InnoDB为表引擎。而parts表即part_name字段为外键,关联到books表的book_borrower字段.注意两 个字段分别是char和varchar都是字符串类型。on delete cascade意思为当books表有相关记录删除时,那parts表也会跟着删除相关联的记录. 理论上parts表的part_name字段也应该要创建索引才对,但实验证创建关联后自动索引了.
请看phpmyadmin创建后的截图:
books表
parts表
那么创建关联表后有什么特性?实践一下就知道,先在books加些记录上去!
- Insert INTO `books` (`book_id`, `book_name`, `book_pic`, `book_author`, `book_pub`, `book_sort`, `book_owner`, `book_borrower`, `book_borrower_time`) VALUES
- (1, '设计中的设计', 'http:///mpic/s2165932.jpg', '原研哉', '山东人民出版社', '视觉设计', NULL, '阿健', NULL),
- (2, '点石成金:访客至上的网页设计秘笈', 'http:///mpic/s1723386.jpg', '(美)Steve Krug', '机械工业出版社', '交互设计', NULL, 'Robin', NULL),
- (3, '交互设计之路', 'http:///mpic/s1517284.jpg', '(美)库帕(Coper,A.)', '电子工业出版社', '交互设计', NULL,'CSSRain', NULL),
- (4, '软件观念革命', 'http:///lpic/s1554354.jpg', '(美)库珀', '电子工业出版社', '交互设计', NULL, '一揪', NULL);
好了现在现在注意看books的book_borrower列里的值分别为:"阿健","Robin","CSSRain","一揪"
在parts表里插入一条记录:
- Insert INTO `bookshare`.`parts` (
- `part_id` ,
- `part_name` ,
- `part_mail` ,
- `part_pass`
- )
- VALUES (
- '1', '阿健', '0758jian@', '8636257'
- );
这里phpmyadmin里显示:
接下来我们继续添加一条记录看看:
- Insert INTO `bookshare`.`parts` (
- `part_id` ,
- `part_name` ,
- `part_mail` ,
- `part_pass`
- )
- VALUES (
- '2', '小飞', 'xioafei@21cn.com.cn', '123456'
- );
这里phpmyadmin显示:
为什么出错?相信你也应该看出了眉头了,因为books表book_borrower记录里没有"小飞"这个借阅者,parts表的part_name字段是关联到book_borrower字段,所以会提示出错,这样的作用相信你也想到了,确保两个数据表中的关联性!
还记得on delete cascade吗?试试下面SQL语句,再看看phpmyadmin里两个表的变化:
- Delete FROM books Where book_borrower = "阿健";