管理外键

时间:2010-04-05 15:38:01

标签: php mysql database

所以我有一个包含几张桌子的数据库。

第一个表包含用户ID,名字和姓氏。

第二个表包含用户ID,兴趣ID和兴趣评级。

还有另一张表格中包含所有兴趣ID。

对于每个兴趣ID(即使添加了新兴趣ID),我需要确保每个用户都有该兴趣ID的条目(即使其空白或有默认值)。

外键是否有助于这种情况?或者,当我添加新密钥时,是否需要使用PHP来更新每条记录?

4 个答案:

答案 0 :(得分:1)

外键是一种约束,因此当您尝试添加记录时,它们只能失败

您可以使用触发器完成您所描述的内容。我不知道MySql语法,但在SQL Server中它看起来像这样:

CREATE TRIGGER TR_ensure_user_interest ON interest FOR INSERT, UPDATE AS
BEGIN
    INSERT user_interest (user_id, interest_id)
    SELECT user_id, interest_id
      FROM inserted
          ,user
    EXCEPT (SELECT user_id, interest_id)
END

请注意,这是一种相当低效的方法,但它应涵盖您关注的许多案例。

更新:我同意其他在这里观察过设计“气味”的人。如果您可以使用JOIN查询完成所需的结果,那将是一个更有效的解决方案。但是,我试图回答实际问的问题。 (另外,我遇​​到过这种情况,物理记录对其他不熟悉复合查询的数据库用户很有帮助。)

答案 1 :(得分:0)

听起来你强迫你的物理设计过于严密地反映你的逻辑设计。

也许最好重新考虑为什么需要为物理表中的每个用户插入一行。如果给定用户没有关联的兴趣ID,你难道不能只编写你的查询以假设兴趣ID的默认值吗?

答案 2 :(得分:0)

  

对于每个兴趣ID(即使是新的   添加了),我需要确定   每个用户都有一个条目   利息ID(即使它是空白的,或者有   缺省值)。

听起来您需要在其中一个查询中使用OUTER JOINLEFTRIGHT)。

例如,如果您希望获得特定人对每种兴趣的兴趣程度:

假设您的表格如下:
用户:
user_id PK
用户

user_interests:
user_id PK FK
interest_id PK FK
interest_level

兴趣:
interest_id PK
兴趣

SELECT i.interest, ui.interest_level
FROM interests i
INNER JOIN user_interests ui USING (interest_id)
LEFT JOIN users u USING (user_id)
WHERE user_id = ?

?是一个占位符。

请注意,对于没有数据的兴趣,ui.interest_level将为空。

答案 3 :(得分:0)

“外键有助于这种情况吗?”

没有

您的约束是一种“完整性”约束。这意味着对于添加的每个新兴趣,必须有多少行添加到USER_INTEREST表中,因为有用户。

没有SQL系统能够为您强制执行。您可以通过代码强制执行它。