我正在使用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允许您使用“关系”视图定义外键。但是由于MySQL只支持对“INNO DB”表的外部约束,所以第一步是确保你所使用的表是这种类型的。

要设置一个外键,使CHILD表中的PID列引用PARENT表中的ID列,可以执行以下操作:

For both tables, go to the operations tab and change their type to "INNO DB" Make sure ID is the primary key (or at least an indexed column) of the PARENT table. In the CHILD table, define an index for the PID column. While viewing the structure tab of the CHILD table, click the "relation view" link just above the "add fields" section. You will be given a table where each row corresponds to an indexed column in your CLIENT table. The first dropdown in each row lets you choose which TABLE->COLUMN the indexed column references. In the row for PID, choose PARENT->ID from the dropdown and click 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有优势,你为什么要创建外键约束呢?您可以在应用程序的模型级别上处理这个问题。只需确保要用作外键的列已被索引!

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

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

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

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

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

步骤2。创建主表

这里customer是主表,customer_id是主键

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

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

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

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

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

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

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

步骤1: 你必须加上这一行: default-storage-engine = InnoDB 在mysql配置文件(my.cnf或my.ini,取决于您的操作系统)的[mysqld]部分,并重新启动mysqld服务。

步骤2: 现在,当你创建表时,你会看到表的类型是:InnoDB

步骤3: 创建父表和子表。现在打开子表,选择U想要有外键的列: 从动作标签中选择索引键,如下所示。

步骤4: 现在打开同一子表中从底部靠近打印视图的关系视图,如下所示。

步骤5: 从下拉菜单中选择你想要外键为Select the Parent column的列。 dbName.TableName.ColumnName

为ON DELETE和ON UPDATE选择合适的值

如果你想使用phpMyAdmin来建立关系,你必须做两件事。首先,您必须在引用表中的外键列上定义一个索引(因此,foo_bar。Foo_id,在你的情况下)。然后,转到关系视图(在引用表中)并选择引用的列(在本例中为foo.id)以及on update和on delete操作。

我认为外键是有用的,如果你有多个表彼此链接,特别是,你的删除脚本将变得非常短,如果你设置正确的引用选项。

编辑:确保两个表都选择了InnoDB引擎。