在phpMyAdmin中设置外键?

我正在使用phpMyAdminbuild立一个数据库。 我有两个表( foobar ), 索引在他们的主键 。 我正在尝试在它们之间创build一个关系表( foo_bar ),使用它们的主键作为外键。

我创build这些表为MyISAM,但已经把所有三个更改为InnoDB,因为我读了MyISAM不支持外键。 所有的id字段是INT(11)

当我selectfoo_bar表时,单击“关系视图”链接,并尝试将FK列设置为database.foo.iddatabase.bar.id ,它表示“No index defined!” 在每列旁边。

我错过了什么?

澄清/更新

为了简单起见,我想继续使用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; 

这只是让我感到不舒服,没有在数据库中明确定义FKs。

如果你想使用phpMyAdminbuild立关系,你必须做2件事情。 首先,你必须在引用表中的外键列上定义一个索引(所以你的情况是foo_bar.foo_id)。 然后,去关系视图(在引用表),并select引用列(所以在你的情况下foo.id)和on更新和删除操作。

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

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

phpMyAdmin允许你使用他们的“关系”视图来定义外键。 但是,既然MySQL只支持“INNO DB”表上的外部约束,第一步就是确保你使用的表是这种types的。

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

  1. 对于这两个表,转到操作选项卡并将其types更改为“INNO DB”
  2. 确保ID是PARENT表的主键(或者至less是索引列)。
  3. 在CHILD表中,为PID列定义一个索引。
  4. 查看CHILD表格的结构选项卡时,单击“添加字段”部分上方的“关系视图”链接。
  5. 您将得到一个表,其中每行对应于CLIENT表中的索引列。 每行中的第一个下拉列表可让您select索引列引用的TABLE-> COLUMN。 在PID的行中,从下拉列表中selectPARENT-> ID,然后单击GO。

通过在CHILD表上进行导出,您应该看到为PID列创build了一个外键约束。

这是一篇维基百科文章的摘要。 它指定您可以在PHPmyadmin中规定的不同types的关系。 我把它放在这里是因为它与@Nathan的设置“on update / delete”的外键选项的评论有关,但对于评论来说太大了 – 希望它有帮助。

级联

只要主(被引用)表中的行被删除(resp。updated),具有匹配的外键列的子表(引用)表的相应行也将被删除(或更新)。 这被称为级联删除(resp。update [2])。

限制

当外键表中存在引用被引用表中的值的行时,不能更新或删除该值。 同样,只要从外键表中引用它,就不能删除该行。

没有行动

没有行动和RESTRICT是非常相似的。 NO ACTION和RESTRICT之间的主要区别在于,在NO ACTION的情况下,参照完整性检查是在尝试更改表格后完成的。 RESTRICT在尝试执行UPDATE或DELETE语句之前执行检查。 如果参照完整性检查失败,那么这两个参照行为的作用相同:UPDATE或DELETE语句将导致错误。

SET NULL

当引用行被更新或删除时,引用行中的外键值被设置为NULL。 这只有在引用表中的相应列可以为空时才有可能。 由于NULL的语义,外键列中具有NULL的引用行不需要引用行。

默认设置

与SET NULL类似,当引用行被更新或删除时,引用行中的外键值被设置为列缺省值。

在phpmyadmin中,只需通过其GUI即可分配外键。 点击表格并转到结构选项卡。 在表格下方find关系视图(如下图所示)。

在这里输入图像描述

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

在这里输入图像描述

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

对于那些新的数据库….并需要ALTER一个现有的表。 很多事情似乎很简单,但总是有一些…在A和B之间。

在别的之前,看看这个 。

  1. 确保你有P_ID(家长和子表上的父母ID)。
  2. 当然,它已经填补了父母。 不一定以真实和最终的方式在孩子身上。 因此,例如P_ID#3(在子表中可能会多次指向父表中的原始P_ID)。
  3. 转到SQL选项卡(我正在使用phpMyAdmin,应该在其他类似),并执行此命令:

    ALTER TABLE child_table_name
    添加外键(P_ID)
    参考parent_table_name(P_ID)

  4. 点击子表,比结构,最后在关系视图上。 完成你的数据库规划。 在这之前有一个关于级联,限制等的好的答案。当然,它可以通过命令来完成。

外键意味着一个表的非主属性 在phpMyAdmin * 中检查另一个 * 的主属性。首先设置你想设置外键的列作为索引

然后点击关联视图

你可以find设置外键的选项

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

不要忘记两列应该有相同的数据types。

例如,如果一列是INTtypes而另一列是tinyinttypes,则会出现以下错误:

在[PID列]上创build外键时出错(检查数据types)

第一步:你必须在你的mysqlconfiguration文件(my.cnf或my.ini,取决于你的操作系统)的[mysqld]部分下添加一行:default-storage-engine = InnoDB,然后重新启动mysqld服务。 在这里输入图像描述

第二步:现在当你创build表时,你会看到表的types是:InnoDB

在这里输入图像描述

第3步:创build父表和子表。 现在打开Child表并select列U,如下所示:外键:从操作标签中select索引键,如下所示。

在这里输入图像描述

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

在这里输入图像描述 第5步:select列U,喜欢将外键作为从下拉列表中select父列。 dbName.TableName.ColumnName

为ON DELETE和ON UPDATEselect适当的值 在这里输入图像描述