在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只是让我感到不舒服。

692375 次浏览

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

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

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

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

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

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

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

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

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

例如,如果一列是INT类型,另一列是tinyint类型,你会得到以下错误:

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

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

级联

每当主(引用)表中的行被删除时(resp。更新后),相应的子(引用)表的行与匹配的外键列将被删除(resp。更新)以及。这被称为级联删除(resp。更新[2])。

限制

如果外键表中存在引用引用表中的值的行,则不能更新或删除该值。类似地,只要外键表中有对该行的引用,就不能删除该行。

不采取行动

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

设置为空

更新或删除引用行的时候,引用行的外键值被设置为NULL。只有在引用表中各自的列为空时才可能这样做。由于NULL的语义,外键列中包含NULL的引用行不需要引用行。

设置默认

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

对于那些刚接触数据库....的人并且需要ALTER一个现有的表。很多事情看起来都很简单,但总有一些……在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. Click on child table, than structure, finally on relational view. Finish your DB planning there. There was a nice answer before this one about cascade, restrict, etc. Of course it could be done by commands...

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

然后点击关系视图

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

在phpmyadmin中,您可以简单地通过其GUI分配外键。单击表并进入结构选项卡。在表格的下方找到关系视图(如下图所示)。

enter image description here

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

enter image description here

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

< p >步骤1: 你必须加上这一行: default-storage-engine = InnoDB 在mysql配置文件(my.cnf或my.ini,取决于您的操作系统)的[mysqld]部分,并重新启动mysqld服务。 enter image description here < / p > < p >步骤2: 现在,当你创建表时,你会看到表的类型是:InnoDB

enter image description here

< p >步骤3: 创建父表和子表。现在打开子表,选择U想要有外键的列: 从动作标签中选择索引键,如下所示

enter image description here

< p >步骤4: 现在打开同一子表中从底部靠近打印视图的关系视图,如下所示

enter image description here 步骤5: 从下拉菜单中选择你想要外键为Select the Parent column的列。 dbName.TableName.ColumnName < / p >

为ON DELETE和ON UPDATE选择合适的值 enter image description here < / p >

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

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

首先将存储引擎设置为InnoDB

First set Storage Engine as InnoDB

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

那么关系视图选项enable . bb0

这是一个老帖子,但回答,因为如果对任何人都有用。

步骤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。现在选择ON DELETE和ON UPDATE你想做的事情,从当前表中选择列,选择DB (SAME DB),从该表中选择关系表和主键,如下图和保存所示

enter image description here

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

新版本的phpMyAdmin不再有“关系视图”选项,在这种情况下,你必须执行一个语句来实现同样的事情。例如

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

在本例中,如果删除了companies中的一行,那么具有该companyid的所有员工也将被删除。

确保你选择的mysql存储引擎是Innodb,而不是MYISAM,因为Innodb存储引擎支持mysql中的外键。

在phpmyadmin创建外键的步骤:

  1. 轻按结构表将有外键。
  2. 为要用作外键的列创建INDEX
  3. 点击位于表结构下面的关系视图

relation view

  1. 在Relation视图页面中,您可以在字段(被创建为INDEX)前面看到选择选项。

设置外键关系 .

级联更新指定当被引用的列被更新时,该列也将被更新,

当被引用的行被删除时,级联删除指定的行将被删除。

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

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