例如:
表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,所有值都必须相同?
答案 0 :(得分:4)
你应该问自己的问题是:
table 2
中是否有一行没有table 1
中的相应行?
如果您的问题的答案为“否”,那么您需要从table 2
(“孩子”)到table 1
(“父母”)的FOREIGN KEY(又名referential integrity)约束)。您可以将其视为具有从一行到另一行的“指针”,其中DBMS本身保证您永远不会有“悬空”指针。
FOREIGN KEY中的“父”列集必须始终是键,无论是主键还是备用键(a.k.a. UNIQUE)。 “子”可以是任何列或列的组合,无论它们是否是键的一部分。您可以将其视为父项的关键列传播给子项,并且根据传播列的 where 结束,您可以拥有以下两种关系:
父键成为子键的一部分(因此父级“帮助”识别子键):
或
此模型可以是1:N或1:1的关系。
父键不成为子键的一部分:
这会模拟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。