在phpMyAdmin中设置外键?


335

我正在使用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,这让我感到不舒服。

Answers:


365

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

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

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


93
提示:“关系”视图在您的表格下几乎没有链接,对于我而言,我很难一开始就找到它
Mladen Janjetovic

14
除非在该情况下未显示该链接,否则在这种情况下:确保表的类型为InnoDB(在phpMyAdmin的“操作”选项卡下),以免发生这种情况。
muttley91

4
@ muttley91我的表是InnoDB。我仔细检查了。链接仍然没有显示。
afilina

6
@afilina在phpMyAdmin的新版本,它在内部“结构”选项卡上可见,就在选项卡行下方显示为“浏览”,“结构”等
Astitva塔瓦

225

phpMyAdmin允许您使用外键的“关系”视图定义外键。但是由于MySQL只支持对“ INNO DB”表的外部约束,因此第一步是确保您使用的表属于该类型。

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

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

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


2
哇,非常重要的事情要知道。在寻求有关添加外键的帮助时,该页面并不是我发现的第一件事,我希望能经常提及该页面。
user1299656 2014年

86

这是维基百科文章的摘要。它指定您可以在PHPmyadmin中规定的不同类型的关系。我将其放在此处是因为它与@Nathan关于设置“更新/删除”上的外键选项的评论有关,但对于评论来说太大了-希望对您有所帮助。

级联

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

限制

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

不采取行动

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

设置为空

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

默认设置

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


1
更妙的是,直接到MySQL的源文件:dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

62

在phpmyadmin中,您可以仅通过其GUI分配外键。单击表格,然后转到“结构”选项卡。在表格的下面找到“关系视图”(如下图所示)。

在此处输入图片说明

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

在此处输入图片说明

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


16

对于那些刚接触数据库的人,需要更改现有表。很多事情似乎很简单,但是在A和B之间总有某些东西。

任何事情之前,先看看这个

  1. 确保您具有P_ID(父级和子级表上的父级ID)。
  2. 当然,它将已经被填充在父级中。不一定以真实和最终的方式对待孩子。因此,例如P_ID#3(子表中的许多次可能会指向父表中的原始P_ID)。
  3. 转到“ SQL”选项卡(我使用的是phpMyAdmin,其他选项应该与此类似)并执行以下命令:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. 单击子表,然后单击结构,最后单击关系视图。在那里完成数据库计划。在此之前,有一个关于级联,限制等的好答案。当然,可以通过命令来完成...


9

外键表示表的非主要属性引用 phpMyAdmin 中另一个 *的主要属性 *首先将要设置外键的列设置为索引

然后点击“关系视图”

在那里您可以找到设置外键的选项


7

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


4
外键约束为我节省了大量的精力和潜在的错误。例如,假设我要从系统中删除用户。我可以编写代码来指定数据库中存在该用户数据的每个位置,并告诉它删除它。但是我必须始终保持该删除功能为最新。另一方面,如果所有与用户相关的数据都具有用户ID的FK并且设置为在删除时级联,则我所有的代码必须说是“删除此用户”,数据库将负责删除所有具有该用户的FK参考。维护起来更加清洁。
内森·朗

1
@Nathan:这就是我在帖子中所说的。您也可以在模型级别进行处理。您可以从模型上实现删除级联。
markus

3
您几乎总是将参照完整性添加到数据库表中。数据库应保护自己免受错误的应用程序编程的侵害。不要仅依靠您的应用程序来维护数据完整性。当然,每条规则总是有例外,但是我没有为此找到例外。
哈佛(Harv)2012年

4

不要忘记这两列应该具有相同的数据类型。

例如,如果一列是INT类型,另一列是tinyint类型,则将出现以下错误:

在[PID列]上创建外键时出错(检查数据类型)


3

步骤1:您必须在mysql配置文件(取决于您的OS,my.cnf或my.ini)的[mysqld]部分下添加以下行:default-storage-engine = InnoDB并重新启动mysqld服务。 在此处输入图片说明

步骤2:现在,当您创建表时,您将看到表的类型为:InnoDB

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明 步骤5:从下拉列表中选择U列,使其具有外键作为选择父列。dbName.TableName.ColumnName

为ON DELETE和ON UPDATE选择适当的值 在此处输入图片说明



2

这是旧线程,但可以回答,因为如果对任何人有用。

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

第二步。创建主表

customer是主表,customer_id是主键

在此处输入图片说明

第三步。创建外键表并给出索引

这里我们有customer_addresses相关表并存储客户地址,所以这里customer_idcustomer表有

我们可以在创建表时直接选择索引,如下所示

在此处输入图片说明

如果在创建表时忘记提供索引,则可以从表的结构选项卡中提供索引,如下所示。

在此处输入图片说明

第四步。将索引指定给该字段后,转到结构选项卡,然后单击“ 关系视图 ”,如下图所示。

在此处输入图片说明

步骤5。现在选择您要执行的ON DELETE和ON UPDATE,从当前表中选择列,选择DB(SAME DB),从该表中选择关系表和主键,如下图所示,并保存

在此处输入图片说明

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



0

较新版本的phpMyAdmin不再具有“ Relation View ”选项,在这种情况下,您将必须执行一条语句来实现相同的目的。例如

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

在此示例中,如果删除了公司的一行,则具有该公司ID的所有员工也将被删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.