mysql创建外键时报错(errno: 150)
时间:2014-01-21 05:01:14 作者:beebol 标签: foreign key index 分类: Mysql
今天做xtrabackup实验的时候,创建两个表进行做实验,在创建外键约束时报如下错误:
ERROR 1005 (HY000): Can't create table 'test.#sql-e89_c' (errno: 150)
错误的原因是我创建外键时两个表还没有具备创建外键的条件,创建外键的条件是:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键; 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以。 3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以。
满足三个条件后就可以创建了,具体的问题回顾:
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(12) NOT NULL DEFAULT '', `pflag` varchar(2) DEFAULT NULL, `uid` int(10) unsigned DEFAULT NULL, `gid` int(10) unsigned DEFAULT NULL, `sname` varchar(255) DEFAULT NULL, `demo` varchar(64) DEFAULT NULL, `shell` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 CREATE TABLE `shadow` ( `name` varchar(12) NOT NULL DEFAULT '', `passwd` varchar(128) DEFAULT NULL, `mtime` varchar(9) DEFAULT NULL, `tinit` varchar(2) DEFAULT NULL, `minit` varchar(5) DEFAULT NULL, `x` char(1) DEFAULT NULL, `y` char(1) DEFAULT NULL, `z` char(1) DEFAULT NULL, `n` char(1) DEFAULT NULL, PRIMARY KEY (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
创建两个表,usres和shadow。我是想把shadow表的name字段添加外键,语句如下:
[root@localhost:Wed Jan 22 00:51:58 2014 {test}]>alter table shadow add foreign key (`name`) references users (`name`);ERROR 1005 (HY000): Can't create table 'test.#sql-e89_c' (errno: 150) ERROR 1005 (HY000): Can't create table 'test.#sql-e89_c' (errno: 150)
有可能大家看到表结构,就知道创建外键肯定不会成功。当然没有注意,所以被自己坑了,花了我点时间检查,无语了。主要是检查时,把外键条件的第二点给忘记了,没有去检查。
[root@localhost:Wed Jan 22 01:02:00 2014 {test}]>alter table users add index (name); Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0 [root@localhost:Wed Jan 22 01:06:04 2014 {test}]>show index from users; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | users | 0 | PRIMARY | 1 | id | A | 35 | NULL | NULL | | BTREE | | | | users | 1 | name | 1 | name | A | 35 | NULL | NULL | | BTREE | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec) [root@localhost:Wed Jan 22 01:06:10 2014 {test}]>alter table shadow add foreign key (`name`) references users (`name`); Query OK, 0 rows affected (0.04 sec)Records: 0 Duplicates: 0 Warnings: 0 Records: 0 Duplicates: 0 Warnings: 0
添加个索引后,nnd,好了。