31-使用外键需要注意的问题
在MySQL中,InnoDB存储引擎支持对外部关键字约束条件的检查。而对于其他类型存储引擎的表,当使用REFERENCES tbl_name(col_name)子句定义列时可以使用外部关键字,但是该子句没有实际的效果,只作为备忘录或注释来提醒用户目前正定义的列指向另一个表中的一个列。
例如,下面的myisam表外键就没有起作用:
mysql> create table users(id int,name varchar(10),primary key(id)) engine=myisam;
Query OK, 0 rows affected (0.03 sec)
mysql> create table books(id int,bookname varchar(10),userid int ,primary key(id),constraint fk_userid_id foreign key(userid) references users(id)) engine=myisam;
Query OK, 0 rows affected (0.03 sec)
mysql> insert into books values(1,'book1',1);
Query OK, 1 row affected (0.00 sec)
如果用InnoDB存储引擎建表的话,外键就会起作用,具体如下:
mysql> create table users2(id int,name varchar(10),primary key(id)) engine=innodb;
Query OK, 0 rows affected (0.14 sec)
mysql> create table books2(id int,bookname varchar(10),userid int ,primary key(id),constraint fk_userid_id foreign key(userid) references users2(id)) engine=innodb;
Query OK, 0 rows affected (0.18 sec)
mysql> insert into books2 values(1,'book1',1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails ('sakila/books2', CONSTRAINT 'fk_userid_id' FOREIGN KEY ('userid') REFERENCES 'users2' ('id'))
而且,用 show create table命令查看建表语句的时候,发现MyISAM存储引擎并不显示外键的语句,而InnoDB存储引擎就会显示外键语句,具体如下:
mysql> show create table books\G;
1. row
Table: books
Create Table: CREATE TABLE 'books' (
'id' int(11) NOT NULL DEFAULT '0',
'bookname' varchar(10) DEFAULT NULL,
'userid' int(11) DEFAULT NULL,
PRIMARY KEY ('id'),
KEY 'fk_userid_id' ('userid')
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
mysql> show create table books2\G;
1. row
Table: books2
Create Table: CREATE TABLE 'books2' (
'id' int(11) NOT NULL DEFAULT '0',
'bookname' varchar(10) DEFAULT NULL,
'userid' int(11) DEFAULT NULL,
PRIMARY KEY ('id'),
KEY 'fk_userid_id' ('userid'),
CONSTRAINT 'fk_userid_id' FOREIGN KEY ('userid') REFERENCES 'users2' ('id')
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)