我正在使用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;

在数据库中没有显式定义fk只是让我感到不舒服。


当前回答

在phpmyadmin中,您可以简单地通过其GUI分配外键。单击表并进入结构选项卡。在表格的下方找到关系视图(如下图所示)。

您可以从主键附近的列表框中分配锻造键。(见下图)。并保存

自动生成并执行相应的SQL查询。

其他回答

首先设置“存储引擎”为“InnoDB”

然后在结构菜单中启用关系视图选项

确保你的mysql存储引擎是Innodb而不是MYISAM,因为Innodb存储引擎支持mysql中的外键。

在phpmyadmin创建外键的步骤:

轻按结构表将有外键。 为要用作外键的列创建INDEX。 点击位于表结构下面的关系视图

在Relation视图页面中,您可以在字段(被创建为INDEX)前面看到选择选项。

UPDATE CASCADE指定当被引用的列被更新时,该列也将被更新。

DELETE CASCADE指定的行将在删除被引用的行时被删除。

或者,您也可以触发相同的sql查询

ALTER TABLE table_name
ADD CONSTRAINT fk_foreign_key_name
FOREIGN KEY (foreign_key_name)
REFERENCES target_table(target_key_name);

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有优势,你为什么要创建外键约束呢?您可以在应用程序的模型级别上处理这个问题。只需确保要用作外键的列已被索引!

这是一个老帖子,但回答,因为如果对任何人都有用。

步骤1。您的Db存储引擎设置为InnoDB

步骤2。创建主表

这里customer是主表,customer_id是主键

步骤3。创建外键表并给出索引

这里我们有customer_addresses作为相关表和存储客户地址,所以这里customer_id与客户表的关系

创建表时可以直接选择索引

如果你在创建表时忘记了索引,那么你可以从表的结构选项卡中给出索引,如下所示。

步骤4。一旦索引给出字段,去结构选项卡,并点击关系视图,如下图所示

第5步。现在选择ON DELETE和ON UPDATE你想做的,从当前表中选择列,选择DB (SAME DB),从该表中选择关系表和主键,如下图所示,并保存它

现在检查关系是否成功给出,转到外表数据列表并单击外键值,您将重定向到主表记录,然后关系创建成功。

在phpmyadmin中,您可以简单地通过其GUI分配外键。单击表并进入结构选项卡。在表格的下方找到关系视图(如下图所示)。

您可以从主键附近的列表框中分配锻造键。(见下图)。并保存

自动生成并执行相应的SQL查询。