![](/img/trans.png)
[英]Establishin a relation between two tables without the primary key - foreign key relation (ORACLE)
[英]Relation between foreign and primary key?
例如:
表1 :
user_ID -
username -
first_name -
email -
表2 :
message_ID -
user_ID -
message_title -
message_body -
如您所見,我在table 1
中將user_ID
作為主鍵,在第二個表中將其作為外鍵。
如果我在第一張表中輸入2行,例如
1, undergz, sarah, sarah@hotmail.com
2, michel21, michaele, michalzost@gmail.com
現在,michaele輸入消息,現在我將其添加到表2中:
1, 2, hello, hello everybody,
我考慮到第一個表在表2中添加了該條目,並添加了與table 1
相同的user_ID
號。
輸入第二個查詢時,我是通過$_SESSION['user_ID']
變量完成此操作的。 所以就像
INSERT INTO table_2 VALUES (NULL, {$_SESSION['user_id']}, '$title','$message')
我的問題是,這是正確的方法嗎? 我們在表中定義了外鍵,因此我們根據主鍵嚴格輸入數據,所有值都必須相同嗎?
您應該問自己的問題是:
table 2
存在table 1
沒有對應行的行?
如果您的問題的答案為“否”,那么您需要從table 2
(“子代”)到table 1
(“父代”)的FOREIGN KEY(又稱參照完整性 )約束。 您可以認為它是從一行到另一行的“指針”,DBMS本身保證您永遠不會有“懸掛”的指針。
FOREIGN KEY中的“父”列集必須始終是鍵,無論是主鍵還是備用鍵(也稱為UNIQUE)。 “子級”可以是任何列或列的組合,無論它們是否為鍵的一部分。 您可以將其視為父級的鍵列傳播到子級,並根據傳播的列最終指向何處 ,可以具有以下兩種關系:
父鍵成為子鍵的一部分(因此父鍵“幫助”標識子鍵):
要么
這將模擬1:N或1:1關系。
父項不會成為孩子的關鍵部分:
此模型建模為1:N關系,但要求message_ID
自身唯一(而不是與user_ID
結合使用)。
創建表時,可以將FOREIGN KEY約束創建為表定義的一部分。 如果表已經存在,則可以添加FOREIGN KEY約束,前提是FOREIGN KEY約束已鏈接到另一張或同一張表中的現有PRIMARY KEY約束或UNIQUE約束。 一個表可以包含多個FOREIGN KEY約束。
如果FOREIGN KEY約束已經存在,則可以對其進行修改或刪除。 例如,您可能希望表的FOREIGN KEY約束引用其他列。 但是,您不能更改使用FOREIGN KEY約束定義的列的長度。
因此,您只能在table2
使用table1
已經存在的具有user_ID
值。
關於您的問題:
我的問題是,這是正確的方法嗎?
看來是的。
我們在表中定義外鍵,所以我們根據主鍵嚴格輸入數據
正確
所有值都必須相同嗎?
這取決於它必須是table1
中已經存在的值。 對於您的情況,對於每個登錄名(用戶),該值都應來自該用戶。 但是,如果您使用另一個用戶登錄,則該值應該是該用戶的ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.