外键和主键之间的关系?

时间:2012-02-02 11:14:31

标签: sql

例如:

表1

user_ID - 
username -
first_name -
email -

表2

message_ID - 
user_ID - 
message_title -
message_body - 

如您所见,user_ID中有table 1作为主键,第二个表中有外键。

如果我在第一个表格中输入2行,例如

1, undergz, sarah, sarah@hotmail.com
2, michel21, michaele, michalzost@gmail.com

现在,michaele输入了消息,现在我将其添加到表2中:

1, 2, hello, hello everybody, 

我在表2中添加了此条目,考虑到第一个表格,我添加的user_ID数字与table 1中的数字相同。

当我输入第二个查询时,我是从$_SESSION['user_ID']变量执行此操作的。所以它就像

INSERT INTO table_2 VALUES (NULL, {$_SESSION['user_id']}, '$title','$message') 

我的问题是,这是正确的方法吗?我们在表中定义外键,所以我们根据主键输入数据STRICTLY,所有值都必须相同?

2 个答案:

答案 0 :(得分:4)

你应该问自己的问题是:

table 2中是否有一行没有table 1中的相应行?

如果您的问题的答案为“否”,那么您需要从table 2(“孩子”)到table 1(“父母”)的FOREIGN KEY(又名referential integrity)约束)。您可以将其视为具有从一行到另一行的“指针”,其中DBMS本身保证您永远不会有“悬空”指针。

FOREIGN KEY中的“父”列集必须始终是键,无论是主键还是备用键(a.k.a. UNIQUE)。 “子”可以是任何列或列的组合,无论它们是否是键的一部分。您可以将其视为父项的关键列传播给子项,并且根据传播列的 where 结束,您可以拥有以下两种关系:

1)“识别”关系

父键成为子键的一部分(因此父级“帮助”识别子键):

identifying relationshipidentifying relationship

此模型可以是1:N或1:1的关系。

2)“非识别”关系

父键成为子键的一部分:

non-identifying relationship

这会模拟1:N关系,但要求message_ID本身是唯一的(而不是与user_ID组合)。

答案 1 :(得分:0)

  

您可以创建FOREIGN KEY约束作为表的一部分   创建表时的定义。如果表已经存在,则可以   添加FOREIGN KEY约束,前提是FOREIGN KEY约束   链接到现有的PRIMARY KEY约束或UNIQUE约束   在另一个或相同的表中。一个表可以包含多个FOREIGN   关键约束。

     

如果已存在FOREIGN KEY约束,则可以修改或删除   它。例如,您可能需要表的FOREIGN KEY约束   引用其他列。但是,你不能改变一个长度   使用FOREIGN KEY约束定义的列。

因此,您只能在table2中使用user_ID中已存在table1的值{。}}。


关于你的问题:

  

我的问题是,这是正确的方法吗?

似乎是的。


  

我们在表中定义外键,因此我们根据主键

输入数据STRICTLY

正确


  

所有值必须相同?

取决于它,它必须是table1中已存在的值。在您的情况下,对于每个登录(用户),值应来自该用户。但是,如果您使用其他用户登录,则该值应为该用户的ID。