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


当前回答

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

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

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

其他回答

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

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

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

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

然后点击关系视图

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

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

步骤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选择合适的值

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

在做其他事情之前,先看看这个。

Make sure you have P_ID (parent ID on both parent and child table). Of course it will be already filled in the parent. Not necessarily in the child in a true and final way. So for instance P_ID #3 (maybe many times in the child table will be pointing to original P_ID at parent table). Go to SQL tab (I am using phpMyAdmin, should be similar in other ones) and do this command: ALTER TABLE child_table_name ADD FOREIGN KEY (P_ID) REFERENCES parent_table_name (P_ID) 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...