phpadmin mysql 外键_mysql - 在phpMyAdmin中设置外键?

mysql - 在phpMyAdmin中设置外键?

我正在使用phpMyAdmin建立一个数据库。 我有两个表(foo_bar和database.foo.id),在主键上编制索引。 我试图在它们之间创建一个关系表(database.bar.id),使用它们的主键作为外键。

我创建了这些表作为MyISAM,但后来将这三个都改为InnoDB,因为我读到MyISAM不支持外键。 所有foo_bar字段是database.foo.id。

当我选择foo_bar表时,单击“关系视图”链接,并尝试将FK列设置为database.foo.id和database.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,我会感到很不舒服。

9个解决方案

322 votes

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

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

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

rael_kid answered 2019-02-09T00:58:21Z

210 votes

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

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

对于这两个表,请转到操作选项卡并将其类型更改为“INNO DB”

确保ID是PARENT表的主键(或至少是索引列)。

在CHILD表中,定义PID列的索引。

在查看CHILD表的结构选项卡时,单击“添加字段”部分上方的“关系视图”链接。

您将获得一个表,其中每行对应于CLIENT表中的索引列。 每行的第一个下拉列表允许您选择索引列引用的TABLE-> COLUMN。 在PID行中,从下拉列表中选择PARENT-> ID,然后单击GO。

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

awais answered 2019-02-09T00:59:34Z

74 votes

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

级联

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

限制

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

没有行动

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

SET NULL

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

默认设置

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

Brett answered 2019-02-09T01:01:04Z

50 votes

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

Ks5HL.png

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

G2dvy.png

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

Nishad Up answered 2019-02-09T01:01:41Z

11 votes

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

除此之外,看看这个。

确保您具有P_ID(父表和子表上的父ID)。

当然它已经填写了父母。 不一定真正和最终的方式在孩子身上。 因此,例如P_ID#3(可能在子表中多次指向父表的原始P_ID)。

转到SQL选项卡(我使用phpMyAdmin,应该与其他类似)并执行以下命令:

ALTER TABLE child_table_name

添加外键(P_ID)

参考parent_table_name(P_ID)

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

user2060451 answered 2019-02-09T01:02:58Z

9 votes

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

然后单击RELATION VIEW

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

Shafeeq M kunjumoideen answered 2019-02-09T01:03:41Z

7 votes

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

markus answered 2019-02-09T01:04:13Z

4 votes

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

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

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

pouya answered 2019-02-09T01:04:50Z

2 votes

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

UT4uG.jpg

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

ceG8z.jpg

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

SUn3i.jpg

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

8TqnL.jpg第5步:选择列U喜欢将外键设置为从下拉列表中选择父列。dbName.TableName.ColumnName

为ON DELETE和ON UPDATE选择适当的值

gystc.jpg

Vinod answered 2019-02-09T01:05:47Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值