MySQL创建关联表可以理解为是两个表之间有个外键关系,但这两个表必须满足三个条件

                                1.两个表必须是InnoDB数据引擎

                                2.使用在外键关系的域必须为索引型(Index)

                                3.使用在外键关系的域必须与数据类型相似

下面分别建两个表来说明一下:



 


  1. Create TABLE IF NOT EXISTS `books` (   
  2.   `book_id` smallint(6) NOT NULL auto_increment COMMENT '书籍编号',   
  3.   `book_name` char(20) NOT NULL COMMENT '书名',   
  4.   `book_pic` varchar(200) NOT NULL COMMENT '封面',   
  5.   `book_author` char(20) NOT NULL COMMENT '作者',   
  6.   `book_pub` char(40) NOT NULL COMMENT '出版社',   
  7.   `book_sort` char(6) NOT NULL COMMENT '分类',   
  8.   `book_owner` char(6) default NULL COMMENT '所有者',   
  9.   `book_borrower` char(7) default NULL COMMENT '借阅者',   
  10.   `book_borrower_time` date default NULL COMMENT '借阅时间',   
  11.   PRIMARY KEY  (`book_id`),   
  12.   INDEX (book_borrower))   
  13. ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=5 ;  




 


  1. Create TABLE IF NOT EXISTS `parts` (   
  2.   `part_id` smallint(6) NOT NULL COMMENT '成员编号',   
  3.   `part_name` varchar(6) NOT NULL COMMENT '成员名',   
  4.   `part_mail` varchar(50) NOT NULL COMMENT '邮箱',   
  5.   `part_pass` varchar(20) NOT NULL COMMENT '密码',   
  6.   PRIMARY KEY  (`part_id`),   
  7. FOREIGN KEY(part_name) REFERENCES books(book_borrower) on delete cascade on update cascade)   
  8. 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加些记录上去!



 


  1. Insert INTO `books` (`book_id`, `book_name`, `book_pic`, `book_author`, `book_pub`, `book_sort`, `book_owner`, `book_borrower`, `book_borrower_time`) VALUES  
  2. (1, '设计中的设计', 'http:///mpic/s2165932.jpg', '原研哉', '山东人民出版社', '视觉设计', NULL, '阿健', NULL),   
  3. (2, '点石成金:访客至上的网页设计秘笈', 'http:///mpic/s1723386.jpg', '(美)Steve Krug', '机械工业出版社', '交互设计', NULL, 'Robin', NULL),   
  4. (3, '交互设计之路', 'http:///mpic/s1517284.jpg', '(美)库帕(Coper,A.)', '电子工业出版社', '交互设计', NULL,'CSSRain', NULL),   
  5. (4, '软件观念革命', 'http:///lpic/s1554354.jpg', '(美)库珀', '电子工业出版社', '交互设计', NULL, '一揪', NULL);  


好了现在现在注意看books的book_borrower列里的值分别为:"阿健","Robin","CSSRain","一揪"

在parts表里插入一条记录:




 


  1.  
  2. Insert INTO `bookshare`.`parts` (   
  3. `part_id` ,   
  4. `part_name` ,   
  5. `part_mail` ,   
  6. `part_pass`    
  7. )   
  8. VALUES (   
  9. '1', '阿健', '0758jian@', '8636257'  
  10. );  


这里phpmyadmin里显示:

接下来我们继续添加一条记录看看:




 


  1.   
  2. Insert INTO `bookshare`.`parts` (   
  3. `part_id` ,   
  4. `part_name` ,   
  5. `part_mail` ,   
  6. `part_pass`    
  7. )   
  8. VALUES (   
  9. '2', '小飞', 'xioafei@21cn.com.cn', '123456'  
  10. );  

这里phpmyadmin显示:


为什么出错?相信你也应该看出了眉头了,因为books表book_borrower记录里没有"小飞"这个借阅者,parts表的part_name字段是关联到book_borrower字段,所以会提示出错,这样的作用相信你也想到了,确保两个数据表中的关联性!

还记得on delete cascade吗?试试下面SQL语句,再看看phpmyadmin里两个表的变化:



 


  1. Delete FROM books Where book_borrower = "阿健";