题
我设置了一个数据库使用头文件.我有两个表(foo
和 bar
), 索引上他们的主要钥匙.我试图创建一个关系表(foo_bar
)之间他们,利用他们的主键作为外键。
我创建了这些表格作为些,但由于改变所有三个少,因为我读了那些不支持外键。所有 id
田 INT(11)
.
当我选择的 foo_bar
表,点击"相关图"的链接,并试图设置的FK列 database.foo.id
和 database.bar.id
, 它说 "没有索引的定义的!" 除了每个柱。
我是什么丢失?
澄清/更新
为了简明起见,我想继续使用头文件.我目前正在使用XAMPP,这是很容易的,足以让我集中在PHP/CSS/Javascript,它带有头文件.
此外,虽然我还没有能够设立明确的外键然而,我的确有一个关系表和可以执行加入这样的:
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
它只是让我不舒服不要有驻明确定义的数据库。
解决方案
如果你想使用phpMyAdmin来建立关系,你必须做两件事情。首先,你必须定义上的参照表的外键列的索引(所以foo_bar.foo_id,你的情况)。然后,转到关系图(在参照表),选择称为柱(因此在你的情况foo.id)和上更新和删除上动作。
我想,如果你已经链接到一个多个表另一个,特别是你删除脚本会,如果你正确设置参考选项变得很短的外键是有用的。
编辑:确保两个表的具有InnoDB引擎选择
其他提示
头文件可以定义外键用他们的"关系"的观点。但是,因为MySQL仅支持国外的约束"创新体制数据库"的表格,第一步是要确保表格你正在使用的类型。
设置一个外国的关键因此,PID表中列名儿童参考ID列在表名为父,你可以做到以下几点:
- 对于这两种表格,去操作标签和改变他们的类型,以"创新DB"
- 确保ID是主要的关键(或至少一个索引列)的父母表。
- 在儿童表,确定一个指数为PID列。
- 同时观看的结构标签的儿童表,点击"相关图"的链接上"增加的领域"部分。
- 你将给出一个表,其中每个行对应索引列在你的客户表。第一个拉在各行可以让你选择这表>列的索引列参考文献。在行PID,选择父>ID从拉击走。
通过做一个出口上的孩子表格,你应该看到一个外国的关键制约因素已经为PID列。
这是维基百科文章的摘要。它规定了不同类型,你可以在phpMyAdmin规定的关系。我把它在这里,因为这是有关@上设置外键选项“上更新/删除”,但对于评论过大森的评论 - 希望它能帮助
<强> CASCADE 强>
每当在主(引用)表中的行被删除(相应的更新),儿童的各行(参照)表具有匹配的外键列将被删除(相应的更新)为好。这就是所谓的级联删除(分别更新[2])。
<强> RESTRICT 强>
一个值不能被更新时或当在引用中引用的表中的值的外键表中存在一个行删除。类似地,行不能被只要存在来自外键表对它的引用删除。
否ACTION 强>
NO ACTION和RESTRICT非常相像。 NO ACTION之间和限制主要区别在于没有处理参照完整性检查是试图改变表后进行。 RESTRICT做检查尝试执行UPDATE或DELETE语句之前。这两个参照动作行为相同的,如果参照完整性检查失败:在UPDATE或DELETE语句将导致一个错误
。设置NULL 强>
的参考行中的外键值时所引用的行被更新或删除被设置为NULL。这是唯一可能如果引用表中的各个列空。由于NULL的语义,引用行与外键列为NULL不需要引用的行。
设置DEFAULT 强>
类似于SET NULL,把参考行中的外键值时所引用的行被更新或删除被设置为默认列
对于那些新的数据库。...并且需要改变现有的表格。很多事情,似乎是非常简单,但总有一些东西...之间的A和B。
之前还有什么,看一看 此.
- 确保你已经p_id为(家长的ID在父母和孩子表格)。
- 当然,它会已经填在父母。不一定儿童在真正的和最终的方式。例如p_id为#3(也许很多时候在儿童表将指向原p_id为在父母表)。
去SQL选项(I am使用头文件,应该是类似在其他的)以及这样做的命令:
ALTER TABLE child_table_name ADD FOREIGN KEY (P_ID) REFERENCES parent_table_name (P_ID)
点击儿童表,比结构,最后在关系图。完成数据库的计划。有一个很好的答案之前这一关联,限制,等等。当然它可以通过命令...
的外键是指表中的非主属性referes的主要属性的另一强> 的 * 在phpMyAdmin 的*先设置你想设置的外键作为索引列
然后在RELATION VIEW
有u能找到的选项设置外键
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的优势,为什么你想在所有创建外键约束。您可以在应用程序的模型级别处理这个问题。只要确保你要使用外键被索引的列!
不要忘记的是,两列应具有相同的数据类型。
例如,如果一个列的类型INT的,而另一个是类型TINYINT你会得到以下错误的:
错误创建外键[PID柱](检查数据类型)
这在 HTTPS官方MySQL文档://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
MySQL的需要外键索引和参考键,以便 外键检查可以快速,并且不需要表扫描。