mysql创建外键时报错(errno: 150)

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,好了。

时间:2014-01-21 05:01:14      作者:beebol      标签: foreign key index      分类: Mysql
  • 分享到:
  • 微博
  • QQ空间
  • 腾讯微博
  • 微信

Copyright © 2015 Gitblog | Proudly powered by Gitblog.