Mysql中使用foreign key 并不像oracleaccess那么简单,现把使用过程应注意的问题做以讲解:
目标:建立下面的外键关系
 
 
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

第一步: 建表

首先打开命令行窗口,进入 Mysql bin 目录,选择相应数据库后,建立 T_USER 表:

 

create table t_user (id int(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(20),group_id int(10)) type=InnoDB;

 

建立 T_PASSPORT 表:

 

create table t_passport (id int(11) NOT NULL auto_increment PRIMARY KEY, serial VARCHAR(20)) type=InnoDB;

 

注意红体字部分: type=InnoDB 关于 InnoDB 的说明如下:

 

InnoDB MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。也就是说如果要采用外键约束,表类型必须时InnoDBmysql默认是MyISAM,这种类型不支持外键约束。

    

第二步:建立外键关系:

 

alter table t_user add foreign key(id) references t_passport (id) on delete cascade on update cascade;

 

此外也可以在建表时直接指定外键:(以下代码未验证)

 

create table temp( id int, name char(20), foreign key(id) references outTable(id) on delete cascade on update cascade);

 

注意:如果表结构是 myISAM, 上面的代码虽然能能执行,但不起任何作用。 References 有的文章(特别是网友的笔记中)写成: Refrences 初学者应注意。

 

第三步,测试

测试 1 :插入外键约束

 

mysql> insert into t_user values(1,'zhaoyuan');

ERROR 1216: Cannot add or update a child row: a foreign key constraint fails

外键约束,因为 t_passport 中尚未有 id 1 的字段。

 

测试 2 、删除外键约束

 

mysql> delete from t_passport;
Query OK, 1 row affected (0.06 sec)

 

mysql> select * from t_user;
Empty set (0.00 sec)

 

 

说明:把 T_user id 列设为外键 , 参照外表 t_passport id , t_passport id 列改变时, T_user 会做相应的改变。

注意: 建立外键的列应该建立索引,且不能为空,引用以被引用的两列应该是同一类型。