【问题标题】:Creating false entries with composite foreign key使用复合外键创建虚假条目
【发布时间】:2012-10-24 07:28:18
【问题描述】:

我正在使用 MySQL 数据库。我有两个表,表 1 和表 2。表 1 中有一个复合主键。表 2 中有一个复合外键,它引用了表 1 中的复合 PK。

我遇到的问题如下图所示:

表 1
|------------PK------------|
菜单ID   |类别 ID  |类别名称
1    |1     |myCategoryName1
1    |2     |myCategoryName2
2    |1     |myCategoryName3
2    |2     |myCategoryName4
2    |3     |myCategoryName5

我可以在表 2 中创建一个引用表 1 中的错误条目的条目:

表 2
|------------FK------------| |----PK----|
菜单  |类别 ID  | postid |帖子名称
1    |3     |1     |myPostName

现在,这不是什么大问题,因为我可以将有效值插入数据库。但是,这似乎是数据库中的一个关系错误,我希望拥有一个干净、功能正常的数据库。有没有办法纠正这个小问题?

更新: 我使用 phpMyAdmin 来实现我的数据库,显然没有办法在 phpMyAdmin 中实现复合外键。我能够通过

查看我错误实现的外键

SHOW CREATE TABLE Table2

其中Table2 是我的第二个具有复合外键的表的名称。

然后我通过手动正确添加复合外键

ALTER TABLE Table2 ADD CONSTRAINT my_fk_constraint
FOREIGN KEY (menuid, categoryid)
REFERENCES Table1(menuid, categoryid)

其中my_fk_constraint 是要添加的约束的名称。

注意:以这种方式手动添加外键约束不允许您在插入新条目时使用下拉菜单(也不能通过单击 FK 列来引用相应的表),如你通常可以在 phpMyAdmin 中。

感谢pstthedayofcondor,你们都说对了,因为我是个使用phpMyAdmin 的小混混。

【问题讨论】:

  • 确保使用了适当的关系感知支持(即 InnoDB,但不是 MyISAM)。此外,这些 FK 是否是通过 DML 定义的(或者它们只是合乎逻辑的)?如果有,怎么做?

标签: foreign-keys key foreign-key-relationship composite-key


【解决方案1】:

正确:不,防止:是!

如果您正确设置约束,则不会发生这种情况: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

【讨论】:

  • 我正在使用 phpMyAdmin,结果发现我错误地实现了外键约束(据我所知,phpMyAdmin 无法实现复合外键)。我使用 DML 手动添加了复合外键约束,因此也感谢您和 pst 的正确性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多