在phpMyAdmin中设置外键?

Nat*_*ong 325 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;
Run Code Online (Sandbox Code Playgroud)

如果不在数据库中明确定义FK,我会感到很不舒服.

rae*_*kid 356

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

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

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

  • 提示:关系视图是您桌面下的小链接,我很难在一开始就找到它 (88认同)
  • 除非该链接没有在那里显示,在这种情况下:确保您的表是InnoDB类型(在phpMyAdmin的Operations选项卡下),这不会发生. (14认同)
  • @afilina在新版本的phpMyAdmin中,它在"结构"选项卡的顶部可见,位于显示"浏览","结构"等的选项卡行的下方. (5认同)
  • @ muttley91我的表是InnoDB.我仔细检查了一下.该链接仍未显示. (4认同)

小智 223

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认同)

Bre*_*ett 83

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

级联

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

限制

当引用引用表中的值的外键表中存在行时,无法更新或删除值.类似地,只要从外键表中引用了行,就不能删除该行.

没有行动

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

SET NULL

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

默认设置

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


Nis*_* Up 57

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

在此输入图像描述

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

在此输入图像描述

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


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


小智 9

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

然后单击RELATION VIEW

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


mar*_*kus 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]
Run Code Online (Sandbox Code Playgroud)

另一方面,如果MyISAM在您的上下文中优于InnoDB,那么为什么要创建外键约束呢?您可以在应用程序的模型级别上处理此问题.只需确保将要用作外键的列编入索引!

  • 外键约束为我节省了很多精力和潜在的错误.例如,假设我要从我的系统中删除用户.我可以编写代码来指定数据库中存在有关该用户的数据的每个位置,并告诉它删除它.但我必须始终保持删除功能最新.另一方面,如果所有与用户相关的数据都具有用户ID的FK并且在删除时设置为级联,则我的所有代码都必须说是"删除此用户",数据库将负责删除所有已删除的内容.对该用户的FK引用.维护得更清洁. (4认同)
  • 您几乎总是将引用完整性添加到数据库表中.数据库应该保护自己免受糟糕的应用程序编程 不要仅依靠您的应用程序来维护数据完整性.当然,每条规则都有例外,但我没有为此找到一条例外. (3认同)

pou*_*uya 5

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

例如,如果一列的类型为 INT,另一列的类型为tinyint,您将收到以下错误:

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


Dev*_*dra 5

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

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

第2步。创建主表

customer是主表并且customer_id是主键

在此输入图像描述

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

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

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

在此输入图像描述

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

在此输入图像描述

步骤4。一旦索引赋予字段,转到结构选项卡并单击关系视图,如下图所示

在此输入图像描述

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

在此输入图像描述

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