2011-06-11 77 views
1

我是新来的外键约束。我会制定一个简单的例子来解释我的情况。自动生成的键,基本问题(InnoDB)的外键约束

我有一个表user和表entry。在user有一个user.firstEntry这是entry.EntryID的外键。在entry中有一个entry.userID,它是user.userID表的外键。这些ID都是自动增量值。

是不是被禁止的循环?那么我将不得不改变设计?

我不能在两个表中插入一些有效的条目,因为第一个插入已经表示约束存在问题。自动提交已关闭。

我该怎么办?

谢谢

+0

当你有两个表格相互引用时,你会遇到问题。如果要删除条目中的记录,则必须确保用户中没有包含该条目记录中的标识的记录。因此,假设您尝试从用户那里删除该记录,那么您现在必须确保您没有具有该ID的条目中的记录。如果它与您想要在条目中删除的记录相同,会发生什么情况?我会重新考虑你的模式。 – kinakuta 2011-06-11 16:56:02

回答

1

有点怪怪的设计,但你可以这样做:

创建用户时,了firstEntry设置为NULL。 用该用户的ID插入条目。 更新用户并将firstEntry设置为插入条目的ID。

1

用户和条目都需要预先创建另一个。因为要么不能创建没有其他,你会有这个问题IF国外约束检查就是这样。

无论从我的问题中我能理解,每个用户似乎都有多个条目。所以你的表设计可能看起来像Table_User(user_id(pk),user_name等),并且条目表可能是Table_Entry(entry_id(pk),entry_whatever,...,user_id(fk到用户表))因为它似乎是用户独立但条目取决于用户。

+0

谢谢,你看我的问题相当不爽。但我仍然想要模拟用户必须至少有一个条目。这是不可能的待办事项? – 2011-06-11 17:01:43

+0

这个条目是什么,为什么它是用户存在的必要条件?仔细看看设计,看看是否有一些逻辑需要实际存在于应用程序层中。我可以建议的一件事是,您在应用程序中创建用户后立即创建第一个条目。 – Jai 2011-06-11 17:16:26

1

外键约束被认为可以防止您将无效数据添加到外键列中。

在大多数情况下,它会检查值是否确实存在于指定的表中。由于在用户和条目表中有循环,因此当您尝试创建条目时,它将检查用户表中是否存在entry.userID的值。当您尝试添加新用户时,它会执行相同的操作,它会检查条目表以查找为user.firstEntry输入的值。如果用户和条目都是新的,则由于您的周期而无法链接两者。新的条目记录需要现有的用户,新的用户记录需要现有的条目。当两个表都是空的时候,我不认为你能够满足约束条件。

我建议在entry条目中保留userID的外键(因为我假设条目链接到用户)并找到其他方式来表示用户的第一个条目。也许是一个user_entry_history表或者这些行的内容。

免责声明 - 这是一段时间,因为我搞砸了数据库设计。