在phpMyAdmin中设置外键?

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

我将这些表创建为MyISAM,但之后将所有这三个表都更改为InnoDB,因为我读到MyISAM不支持外键。 所有id字段都是INT(11)

当我选择foo_bar表时,单击“关系视图”链接,并尝试将FK列设置为database.foo.iddatabase.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建立关系,你必须做2件事。 首先,你必须在引用表中的外键列上定义一个索引(所以你的情况是foo_bar.foo_id)。 然后,进入关系视图(在引用表中)并选择引用的列(所以在你的情况下foo.id)以及on update和delete操作。

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

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


phpMyAdmin允许你使用他们的“关系”视图来定义外键。 但是,因为MySQL只支持“INNO DB”表中的外部约束,所以首先要确保你使用的表是这种类型的表。

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

  • 对于这两个表,转到操作选项卡并将其类型更改为“INNO DB”
  • 确保ID是PARENT表的主键(或至少是索引列)。
  • 在CHILD表中,为PID列定义一个索引。
  • 查看CHILD表格的结构选项卡时,单击“添加字段”部分上方的“关系视图”链接。
  • 您将得到一个表,其中每行对应于CLIENT表中的索引列。 每行中的第一个下拉列表可让您选择索引列引用的TABLE-> COLUMN。 在PID的行中,从下拉列表中选择PARENT-> ID并单击GO。
  • 通过在CHILD表上进行导出,您应该会看到为PID列创建了一个外键约束。


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

    级联

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

    限制

    如果外键表中存在引用引用表中的值的行,则无法更新或删除该值。 同样,只要从外键表中引用该行,就不能删除该行。

    没有行动

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

    SET NULL

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

    默认设置

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

    链接地址: http://www.djcxy.com/p/66751.html

    上一篇: Setting up foreign keys in phpMyAdmin?

    下一篇: Good PHP ORM Library?