关于
mysql外键创建失败的问题
创建persons:
CREATE TABLE `persons` (
`id_p` int(11) NOT NULL AUTO_INCREMENT,
`lastname` varchar(10) DEFAULT NULL,
`firstname` varchar(10) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL,
`city` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id_p`)
); www.2cto.com
再创建表orders:
CREATE TABLE `orders` (
`id_o` int(11) NOT NULL AUTO_INCREMENT,
`orderno` int(11) NOT NULL,
`id_p` int(11) NOT NULL,
PRIMARY KEY (`id_o`),
FOREIGN KEY (`id_p`) REFERENCES `persons` (`id_p`)
);
用show create table orders语句,查询orders的信息发现,外键并没有创建成功。查了一些资料,终于找到了原因。
mysql默认创建的表是MyISAM类型的,需要将表的类型指定为innodb:
www.2cto.com
CREATE TABLE `orders` (
`id_o` int(11) NOT NULL AUTO_INCREMENT,
`orderno` int(11) NOT NULL,
`id_p` int(11) NOT NULL,
PRIMARY KEY (`id_o`),
FOREIGN KEY (`id_p`) REFERENCES `persons` (`id_p`)
) ENGINE=InnoDB;
不过这时提示以下错误:
ERROR 1005 (HY000): Can't create table 'test.orders' (errno: 150)
将persons表的类型也指定为innodb就OK了。
总结一下外键创建失败的几种情况:
1.外键和被引用外键类型不一样,比如integer和double
2.找不到要被引用的列
3.表的字符编码不一样
4.数据引擎类型不一致,比如innodb和myisam
—————————————————————修改默认storage engine———————————————————————
mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。
查看当前数据库的所支持的数据库引擎以及默认数据库引擎
数据库支持的引擎和默认数据库引擎代码
show engines;
show engines;
更改方式1:修改配置文件my.ini
我将my-small.ini另存为my.ini,
在[mysqld]最后添加为上
default-storage-engine=InnoDB
重启服务,数据库默认的引擎修改为InnoDB,如果想默认引擎还是为MyISAM就把InnoDB改为MyISAM也是可以的。
更改方式2:在建表的时候指定或者建完表修改
Mysql代码
--建表的时候指定
create table mytbl(
id int primary key,
name varchar(50)
)type=MyISAM;
--建完表后修改
alter table mytbl2 type = InnoDB;
--查看修改结果(mytest为表所在的database名字)
show table status from mytest;