如何防止外键乱搞?

时间:2010-08-18 19:44:41

标签: database-design foreign-keys

这就是我的表格:

tableMembers | memberID as primary key

tableAddress | addressID as primary key references memberID

tableSubscription | subsID as primary key references memberID

此数据库适用于订阅站点。基本上,如果在tableMembers中插入一行,则会向每个其他表插入相应的行。

我为最后两个表设置了外键,因此我可以访问与tableMembers相关的外键。基本上,如果我从tableAddress访问一行,我会这样做:

SELECT * FROM tableAddress WHERE addressID = (SELECT memberID FROM tableMembers WHERE uname = 'John'); 

我的设置问题是,当ID的同步搞砸了,外键将不再起作用。比方说,当我在tableMembers中插入一行然后tableSubscription由于一些奇怪的原因而几秒钟内功能失调?或者在用户注册的情况下(最新的memberID变为= 2 ),请说他/她没有订阅哪个会使与memberID不同步的subsID(仍然= 1 ) 。稍后,新用户注册(最新成员ID变为= 3 )并订阅( subsID变为= 2 )。这使得我的查询更加令人满意。我该如何防止这种情况?或者如果您认为我不理解外键的概念,请赐教。

1 个答案:

答案 0 :(得分:2)

确保只有一个表具有自动增量ID 。其他人应该从应用程序代码中的插入查询中获取其id,以确保它们是正确的成员。

在伪代码中:

  1. 用户注册并获得 autoincremented id of 3。
  2. 检查 id为last_insert_id()
  3. 用户 订阅某事。身份证 tableSubscription表应该 由您的应用程序代码设置为 你早先得到的价值。