外键用来保证参照完整性,MySQL数据库的MyISAM存储引擎本身并不支持外键。
create table parent( id int not null, primary key(id))engine=innodb; create table child( id int,parent_id int, foreign key(parent_id) references parent(id) )engine=innodb; 被引用(references)的表称为父表,引用的表称为子表。 mysql> show create table child\G; Create Table: CREATE TABLE `child` ( `id` int(11) DEFAULT NULL, `parent_id` int(11) DEFAULT NULL, KEY `parent_id` (`parent_id`), CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
外键定义时的on delete和on update表示在对父表进行delete和update操作时,对子表所做的操作,可定义的子表操作有:
CASCADE:表示当父表发生delete或update操作的时候,对相应的子表中的数据页进行delete或update操作;
SET NULL:表示当父表发生delete或update操作的时候,相应的子表中的数据被更新为null值,但是子表中相对应的列必须允许为NULL值;
NO ACTION:表示当父表发生delete或update操作的时候,抛出错误,不允许这类操作发生;
RESTRICT:表示当父表发生delete或update操作的时候,不允许这类操作发生。
oracle还提供了一种延时检查的外键约束;MySQL就是即时约束。对应oracle来说,对于建立外键的列,一定不要忘记给这个列增加一个索引。而InnoDB存储引擎在外键建立时会自动的对该列增加一个索引。
禁用外键检查:
mysql> set foreign_key_checks=0; mysql> load data …; mysql> set foreign_key_checks=1; |