我正在使用phpMyAdmin设置数据库。我有两个表(foo和bar),在它们的主键上建立索引。我试图在它们之间创建一个关系表(foo_bar),使用它们的主键作为外键。
我用MyISAM创建了这些表,但后来把三个表都换成了InnoDB,因为我读到MyISAM不支持外键。所有id字段都是INT(11)。
当我选择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只是让我感到不舒服。
步骤1:
你必须加上这一行:
default-storage-engine = InnoDB
在mysql配置文件(my.cnf或my.ini,取决于您的操作系统)的[mysqld]部分,并重新启动mysqld服务。
步骤2:
现在,当你创建表时,你会看到表的类型是:InnoDB
步骤3:
创建父表和子表。现在打开子表,选择U想要有外键的列:
从动作标签中选择索引键,如下所示。
步骤4:
现在打开同一子表中从底部靠近打印视图的关系视图,如下所示。
步骤5:
从下拉菜单中选择你想要外键为Select the Parent column的列。
dbName.TableName.ColumnName
为ON DELETE和ON UPDATE选择合适的值
这是一篇维基百科文章的摘要。它指定了可以在PHPmyadmin中规定的不同类型的关系。我把它放在这里,因为它与@Nathan关于设置“更新/删除”外键选项的评论有关,但对于评论来说太大了。
级联
每当主(引用)表中的行被删除时(resp。更新后),相应的子(引用)表的行与匹配的外键列将被删除(resp。更新)以及。这被称为级联删除(resp。更新[2])。
限制
如果外键表中存在引用引用表中的值的行,则不能更新或删除该值。类似地,只要外键表中有对该行的引用,就不能删除该行。
不采取行动
NO ACTION和RESTRICT非常相似。NO ACTION和RESTRICT之间的主要区别是,使用NO ACTION时,参考完整性检查是在尝试修改表之后进行的。RESTRICT在尝试执行UPDATE或DELETE语句之前进行检查。如果引用完整性检查失败,这两个引用操作的作用相同:UPDATE或DELETE语句将导致错误。
设置为空
更新或删除引用行的时候,引用行的外键值被设置为NULL。只有在引用表中各自的列为空时才可能这样做。由于NULL的语义,外键列中包含NULL的引用行不需要引用行。
设置默认
与SET NULL类似,当被引用的行被更新或删除时,引用行的外键值被设置为默认列。
确保你的mysql存储引擎是Innodb而不是MYISAM,因为Innodb存储引擎支持mysql中的外键。
在phpmyadmin创建外键的步骤:
轻按结构表将有外键。
为要用作外键的列创建INDEX。
点击位于表结构下面的关系视图
在Relation视图页面中,您可以在字段(被创建为INDEX)前面看到选择选项。
UPDATE CASCADE指定当被引用的列被更新时,该列也将被更新。
DELETE CASCADE指定的行将在删除被引用的行时被删除。
或者,您也可以触发相同的sql查询
ALTER TABLE table_name
ADD CONSTRAINT fk_foreign_key_name
FOREIGN KEY (foreign_key_name)
REFERENCES target_table(target_key_name);
这是一个老帖子,但回答,因为如果对任何人都有用。
步骤1。您的Db存储引擎设置为InnoDB
步骤2。创建主表
这里customer是主表,customer_id是主键
步骤3。创建外键表并给出索引
这里我们有customer_addresses作为相关表和存储客户地址,所以这里customer_id与客户表的关系
创建表时可以直接选择索引
如果你在创建表时忘记了索引,那么你可以从表的结构选项卡中给出索引,如下所示。
步骤4。一旦索引给出字段,去结构选项卡,并点击关系视图,如下图所示
第5步。现在选择ON DELETE和ON UPDATE你想做的,从当前表中选择列,选择DB (SAME DB),从该表中选择关系表和主键,如下图所示,并保存它
现在检查关系是否成功给出,转到外表数据列表并单击外键值,您将重定向到主表记录,然后关系创建成功。