我正在使用phpMyAdmin建立一个数据库。我有两个表(foo
和bar
),**以它们的主键为索引。我试图在它们之间创建一个关系表(foo_bar
),使用它们的主键作为外键。
我以MyISAM的形式创建了这些表,但后来把这三个表都改成了InnoDB,因为我看到MyISAM不支持外键。所有id'字段都是
INT(11)'。
当我选择foo_bar
表,点击"关系视图"链接,并尝试将FK列设置为database.foo.id
和database.bar.id
时,它在每一列旁边显示"没有定义索引!"。
我错过了什么?
为了简单起见,我想继续使用phpMyAdmin。我目前正在使用XAMPP,它足够简单,让我专注于PHP/CSS/Javascript,而且它自带phpMyAdmin。
另外,虽然我还没能设置明确的外键,但我确实有一个关系表,可以像这样进行连接。
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
只是不在数据库中明确定义外键让我感到不舒服。
phpMyAdmin让你使用他们的"关系"视图定义外键。但是,由于MySQL只支持"INNO DB"表的外键,第一步是要确保你使用的表是这种类型。
要设置一个外键,使名为CHILD的表中的PID列引用名为PARENT的表中的ID列,你可以这样做。
1.对于这两个表,进入操作选项卡,将它们的类型改为"INNO DB"。 2.2.确保ID是PARENT表的主键(或至少是一个索引列)。 3.3. 在CHILD表中,为PID列定义一个索引。 4.4.在查看CHILD表的结构标签时,点击"关系视图"链接,就在"添加字段"部分上方。 5.5. 你将得到一个表格,其中每一行都对应于你的CLIENT表中的一个索引列。每一行的第一个下拉菜单让你选择该索引列所引用的TABLE->COLUMN。在PID行中,从下拉菜单中选择PARENT->ID,然后点击GO。
通过对CHILD表进行导出,你应该看到已经为PID列创建了一个外键约束。
InnoDB允许你通过使用ALTER TABLE向表添加一个新的外键约束。
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
另一方面,如果MyISAM在你的环境中比InnoDB有优势,你为什么要创建外键约束。你可以在你的应用程序的模型层面上处理这个问题。只要确保你想作为外键使用的列是有索引的