在phpMyAdmin中设置外键?

时间:2009-01-19 21:48:11

标签: mysql 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,我会感到很不舒服。

14 个答案:

答案 0 :(得分:343)

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

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

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

答案 1 :(得分:218)

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。
  6. 通过在CHILD表上导出,您应该看到已为PID列创建了外键约束。

答案 2 :(得分:80)

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

<强> CASCADE

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

<强> RESTRICT

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

无行动

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

SET NULL

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

设置默认

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

答案 3 :(得分:54)

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

enter image description here

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

enter image description here

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

答案 4 :(得分:14)

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

在此之前,请先查看this

  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. 点击子表,而不是结构,最后点击关系视图。在那里完成数据库规划。在这个关于级联,限制等之前有一个很好的答案。 当然可以通过命令来完成......

答案 5 :(得分:9)

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

然后点击关系视图

你可以找到设置外键的选项

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

答案 7 :(得分:4)

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

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

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

答案 8 :(得分:3)

第1步: 您必须添加以下行: default-storage-engine = InnoDB 在你的mysql配置文件的[mysqld]部分(my.cnf或my.ini,取决于你的操作系统)下,重新启动mysqld服务。 enter image description here

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

enter image description here

第3步: 创建父表和子表。现在打开Child表并选择U列以获得外键: 从Action Label中选择Index Key,如下所示。

enter image description here

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

enter image description here 第5步: 选择列U喜欢将外键设置为从下拉列表中选择父列。 dbName.TableName.ColumnName

为ON DELETE和ON UPDATE选择适当的值 enter image description here

答案 9 :(得分:1)

首先将存储引擎设置为 InnoDB

First set Storage Engine as InnoDB

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

then the relation view option enable

答案 10 :(得分:1)

这是旧线程,但请回答,因为对任何人都有用。

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

第2步。创建主表

这里customer是主表,customer_id是主键

enter image description here

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

这里有customer_addresses作为相关表并存储了客户地址,因此这里customer_idcustomer表有关联

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

enter image description here

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

enter image description here

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

enter image description here

步骤5 。现在,选择“要删除并进行更新”,从当前表中选择列,选择数据库(SAME DB),从该表中选择关系表和主键,如下图所示,并保存

enter image description here

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

答案 11 :(得分:1)

确保已将mysql存储引擎选择为 Innodb ,而不是 MYISAM ,因为Innodb存储引擎在Mysql中支持外键。

在phpmyadmin中创建外键的步骤:

  1. 点击具有外键的表的结构。
  2. 为要用作外键的列创建INDEX
  3. 点击“关系”视图,将其放置在表格结构下方

relation view

  1. 在“关系”视图页面中,您可以在字段前面看到选择选项(已将其设置为INDEX)。

setting foreign key relation

UPDATE CASCADE 指定在更新引用列时将更新列,

删除引用行时,

删除级联指定行将被删除。

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

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

答案 12 :(得分:0)

摘自https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html上的官方MySQL文档:

  

MySQL要求在外键和引用键上建立索引,以便   外键检查可以快速进行,不需要进行表扫描。

答案 13 :(得分:0)

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

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

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