我正在用MyISAM引擎创建一个MySQL数据库。我相信不可能在MyISAM上使用外键。 DB中的所有表都有主键,但它们都需要至少1个FK。
1)可以使用任何其他选项(除了PK):例如:使用UNIQUE,INDEX FULLTEXT或SPATIAL代替FK,它们用于相同的目的吗?
2)如果1)的答案是<0,那么还能做什么(除了改为InnoDB)?
答案 0 :(得分:1)
你的问题的答案是否定的,MyISAM中没有真正的替代方案。
取决于您的MySQL版本。您可以在triggers之前查看,但是您必须编写一个触发器来代替您通常在Innodb下创建的每个外键。不建议这样做,你是通过这样做重新发明轮子,如果触发器中的逻辑不正确可能会遇到问题。击败目的。
除非MyodAM的功能无法与Innodb一起使用,否则我强烈建议您使用Innodb并在必要时进行优化。
希望有所帮助。
答案 1 :(得分:1)
闻起来好像你不理解FOREIGN KEY
的目的。这是一回事:
FK有副作用:它构建INDEX
。但索引的唯一目的是:
WHERE
子句和表之间的JOINs
。有一种常见的误解是你需要一个FK到JOIN
两个表。这完全是假的。也不需要INDEX
。
底线......
INDEX(es)
。无论如何,请转到InnoDB。
答案 2 :(得分:0)
不,MyISAM不支持FK约束。您无法在MyISAM中强制实施参照完整性。您可以使用触发器自行编码,但不建议这样做。
您可以创建唯一或非唯一的索引,以便为搜索或排序提供查询优化。但这并不能提供参照完整性。
ALTER TABLE MyTable ADD INDEX (column1, column2);
或
ALTER TABLE MyTable ADD UNIQUE INDEX (column1, column2);
除非您希望列除了索引之外还有唯一约束,否则不要使用UNIQUE索引。
除非您要进行全文或空间查询,否则请勿使用FULLTEXT或SPATIAL索引。这些索引是出于特殊目的,通常它们不能与普通索引互换。