首页 文章

在phpMyAdmin中设置外键?

提问于
浏览
292

我正在使用phpMyAdmin设置数据库 . 我有两个表( foobar ), indexed on their primary keys . 我试图在它们之间创建一个关系表( foo_bar ),使用它们的主键作为外键 .

我创建了这些表作为MyISAM,但后来将这三个表改为InnoDB,因为我读到MyISAM不支持外键 . 所有 id 字段均为 INT(11) .

当我选择 foo_bar 表时,单击"relation view"链接,并尝试将FK列设置为 database.foo.iddatabase.bar.id ,它在每列旁边显示 "No index defined!" .

我错过了什么?

澄清/更新

为了简单起见,我想继续使用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 回答

  • 4

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

    在此之前,请看一下this .

    • 确保您拥有P_ID(父表和子表上的父ID) .

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

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

    ALTER TABLE child_table_name
    添加外键(P_ID)
    参考parent_table_name(P_ID)

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

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

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

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

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

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

    • 在查看CHILD表的结构选项卡时,单击"add fields"部分正上方的"relation view"链接 .

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

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

  • 75

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

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

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

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

    步骤5:选择列U喜欢使用外键作为从下拉列表中选择父列 . dbName.TableName.ColumnName

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

  • 2

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

    CASCADE

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

    RESTRICT

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

    NO ACTION

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

    SET NULL

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

    默认设置

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

  • 12

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

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

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

  • 322

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

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

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

  • 50

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

  • 210

    在phpMyAdmin *中 Foreign key means a non prime attribute of a table referes the prime attribute of another *首先设置要将外键设置为索引的列

    然后单击RELATION VIEW

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

  • 9

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

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

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

相关问题