关联2张表时涌现了没法竖立外键的状况,从这个博客看到,题目出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张表的编码charset和collate不一致,2张表都实行实行SQL语句:
alter table 表名 convert to character set utf8;
圆满处理题目;
ps:下面看下MySQL没法竖立外键、查询外键的属性
MyISAM 和InnoDB 解说
InnoDB和MyISAM是许多人在运用MySQL时最常常使用的两个表范例,这两个表范例各有好坏,视细致运用而定。基础的差异为:MyISAM范例不支撑事件处置惩罚等高等处置惩罚,而InnoDB范例支撑。MyISAM范例的表强调的是机能,实在行数度比InnoDB范例更快,然则不供应事件支撑,而InnoDB供应事件支撑以及外部键等高等数据库功用。
以下是一些细节和细致完成的差异:
◆1.InnoDB不支撑FULLTEXT范例的索引。
◆2.InnoDB 中不保留表的细致行数,也就是说,实行select count(*) from table时,InnoDB要扫描一遍全部表来盘算有若干行,然则MyISAM只需简朴的读出保留好的行数即可。注重的是,当count(*)语句包括 where前提时,两种表的操纵是一样的。
◆3.关于AUTO_INCREMENT范例的字段,InnoDB中必需包括只要该字段的索引,然则在MyISAM表中,能够和其他字段一同竖立团结索引。
◆4.DELETE FROM table时,InnoDB不会从新竖立表,而是一行一行的删除。
◆5.LOAD TABLE FROM MASTER操纵对InnoDB是不起作用的,处理方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,然则关于运用的分外的InnoDB特征(比方外键)的表不实用。
别的,InnoDB表的行锁也不是相对的,假如在实行一个SQL语句时MySQL不能确定要扫描的局限,InnoDB表同样会锁全表,比方update table set num=1 where name like “%aaa%”
两种范例最重要的差异就是Innodb 支撑事件处置惩罚与外键和行级锁。而MyISAM不支撑.所以MyISAM每每就轻易被人认为只合适在小项目中运用。
作为运用MySQL的用户角度动身,Innodb和MyISAM都是比较喜好的,假如数据库平台要到达需求:99.9%的稳定性,轻易的扩展性和高可用性来讲的话,MyISAM相对是首选。
缘由以下:
1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读机能是比Innodb强不少的。
2、MyISAM的索引和数据是离开的,而且索引是有紧缩的,内存运用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是严密绑缚的,没有运用紧缩从而会形成Innodb比MyISAM体积巨大不小。
3、常常隔1,2个月就会发作运用开辟人员不小心update一个表where写的局限不对,致使这个表没法一般常使用了,这个时刻MyISAM的优越性就体现出来了,随意从当天拷贝的紧缩包掏出对应表的文件,随意放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。假如是Innodb,生怕不能够有这么快速率,别和我说让Innodb按期用导出xxx.sql机制备份,由于最小的一个数据库实例的数据量基础都是几十G大小。
4、从打仗的运用逻辑来讲,select count(*) 和order by 是最频仍的,也许能占了全部sql总语句的60%以上的操纵,而这类操纵Innodb实在也是会锁表的,许多人认为Innodb是行级锁,谁人只是where对它主键是有用,非主键的都邑锁全表的。
5、另有就是常常有许多运用部门须要我给他们按期某些表的数据,MyISAM的话很轻易,只需发给他们对应那表的frm.MYD,MYI的文件,让他们本身在对应版本的数据库启动就行,而Innodb就须要导出xxx.sql了,由于光给他人文件,受字典数据文件的影响,对方是没法运用的。
6、假如和MyISAM比insert写操纵的话,Innodb还达不到MyISAM的写机能,假如是针对基于索引的update操纵,虽然MyISAM能够会减色Innodb,然则那末高并发的写,从库可否追的上也是一个题目,还不如经由过程量实例分库分表架构来处理。
7、假如是用MyISAM的话,merge引擎能够大大加速运用部门的开辟速率,他们只需对这个merge表做一些select count(*)操纵,异常合适大项目总量约几亿的rows某一范例(如日记,观察统计)的营业表。
固然Innodb也不是相对不必,用事件的项目就用Innodb的。别的,能够有人会说你MyISAM没法抗太多写操纵,然则能够经由过程架构来填补。
SELECT * FROM information_schema.key_column_usage WHERE table_name='表名' ; show create table 表名 ;
MySQL进修以外键的图文详解
有关MySQL数据库中的外键束缚详解
MySQL 的外键与参照完整性: Part 1_PHP教程
以上就是MySQL没法竖立外键的缘由及处理方法的细致内容,更多请关注ki4网别的相干文章!