问题描述
|
我是外键约束的新手。我将举一个简单的例子来说明我的情况。
我有一张桌子
user
和一张桌子entry
。在“ 0”中有一个“ 3”,它是“ 4”的外键。在entry
中有一个entry.userID
,它是user.userID
表的外键。这些ID均为自动增量值。
这样的循环是否被禁止?那我将不得不更改设计吗?
我无法在两个表中插入一些有效的条目,因为第一个插入已经表明约束存在问题。自动提交已关闭。
我该怎么办?
谢谢
解决方法
有点奇怪的设计,但是您可以这样做:
创建用户时,请将firstEntry设置为NULL。
插入具有该用户ID的条目。
更新用户并将firstEntry设置为插入的条目的ID。
, 用户和条目都需要预先创建另一个。并且由于不能在没有另一个的情况下创建任何一个,因此如果在外部约束检查中存在该问题,则会遇到此问题。
从您的问题我能理解的范围内,每个用户似乎都有多个条目。因此您的表设计可能看起来像Table_User(user_id(pk),user_name等),而条目表可能是Table_Entry(entry_id(pk),entry_whatever ......,user_id(fk到用户表))独立,但条目取决于用户。
, 外键约束应该可以防止您将无效数据添加到外键列中。
在大多数情况下,它将检查指定表中是否确实存在该值。由于用户和条目表中都有一个循环,因此当您尝试创建条目时,它将检查用户表中是否存在entry.userID的值。当您尝试添加新用户时,它将执行相同的操作,它将检查条目表中您为user.firstEntry输入的值。如果用户和条目都是新的,则由于您的周期而无法链接两者。新条目记录需要现有用户,而新用户记录需要现有条目。当两个表都为空时,我认为您将无法满足约束条件。
我建议将外来用户ID的外键保留在条目表中(因为我假设条目已链接到用户),并找到某种其他方式来表示用户的第一个条目。也许是一个user_entry_history表或类似的东西。
免责声明-自从我迷恋数据库设计以来已经有一段时间了。