所以我有一个包含几张桌子的数据库。
第一个表包含用户ID,名字和姓氏。
第二个表包含用户ID,兴趣ID和兴趣评级。
还有另一张表格中包含所有兴趣ID。
对于每个兴趣ID(即使添加了新兴趣ID),我需要确保每个用户都有该兴趣ID的条目(即使其空白或有默认值)。
外键是否有助于这种情况?或者,当我添加新密钥时,是否需要使用PHP来更新每条记录?
答案 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 JOIN
(LEFT
或RIGHT
)。
例如,如果您希望获得特定人对每种兴趣的兴趣程度:
假设您的表格如下:
用户:
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系统能够为您强制执行。您可以通过代码强制执行它。