MySql,引擎:MyISAM,可以使用什么索引代替外键

时间:2018-01-22 16:52:52

标签: mysql foreign-keys primary-key innodb myisam

我正在用MyISAM引擎创建一个MySQL数据库。我相信不可能在MyISAM上使用外键。 DB中的所有表都有主键,但它们都需要至少1个FK。

1)可以使用任何其他选项(除了PK):例如:使用UNIQUE,INDEX FULLTEXT或SPATIAL代替FK,它们用于相同的目的吗?

2)如果1)的答案是<0,那么还能做什么(除了改为InnoDB)?

3 个答案:

答案 0 :(得分:1)

你的问题的答案是否定的,MyISAM中没有真正的替代方案。

取决于您的MySQL版本。您可以在triggers之前查看,但是您必须编写一个触发器来代替您通常在Innodb下创建的每个外键。不建议这样做,你是通过这样做重新发明轮子,如果触发器中的逻辑不正确可能会遇到问题。击败目的。

除非MyodAM的功能无法与Innodb一起使用,否则我强烈建议您使用Innodb并在必要时进行优化。

希望有所帮助。

答案 1 :(得分:1)

闻起来好像你不理解FOREIGN KEY的目的。这是一回事:

  • 参照完整性。但这并不是一项要求,如果您编写好的代码,这是一项可以不用的功能。

FK有副作用:它构建INDEX。但索引的唯一目的是:

  • 更快的查找次数。这包括WHERE子句和表之间的JOINs

有一种常见的误解是你需要一个FK到JOIN两个表。这完全是假的。也不需要INDEX

底线......

  1. 编写架构并编写查询。
  2. 遇到性能问题(当表中有几千行时可能会发生这种情况),请查看添加INDEX(es)
  3. 无论如何,请转到InnoDB。

答案 2 :(得分:0)

不,MyISAM不支持FK约束。您无法在MyISAM中强制实施参照完整性。您可以使用触发器自行编码,但不建议这样做。

您可以创建唯一或非唯一的索引,以便为搜索或排序提供查询优化。但这并不能提供参照完整性。

ALTER TABLE MyTable ADD INDEX (column1, column2);

ALTER TABLE MyTable ADD UNIQUE INDEX (column1, column2);

除非您希望列除了索引之外还有唯一约束,否则不要使用UNIQUE索引。

除非您要进行全文或空间查询,否则请勿使用FULLTEXT或SPATIAL索引。这些索引是出于特殊目的,通常它们不能与普通索引互换。

记录中,you should be using InnoDB