簡體   English   中英

我的MySQL數據庫表上的此外鍵對我有什么作用?

[英]What will this Foreign Key on my MySQL Database table do for me?

我正在使用PHP和MySQL構建項目管理項目。 我決定添加一個“論壇類型”的“討論”部分。 我計划將其設為與您的典型論壇相同,但將由項目ID代替不同的論壇主題/部分,因此我的項目管理軟件中的每個項目都將擁有自己的論壇部分。

因此,我真正需要的只是一個主題帖子,然后是帖子回復。 每個主題都會有一個主題/標題,然后是一個正文/描述,任何后續的帖子/回復都將是“帖子”

所以我正在建立主題帖子 MySQL數據庫表

我的架構如下。 現在,我已經使用這些數據庫很多年了,但是對於像FOREIGN KEYS這樣的更高級功能,我沒有太多經驗

所以我有這個外鍵SQL ...

ALTER TABLE posts
ADD FOREIGN KEY(parent_topic_id)  
REFERENCES topics(topic_id)  
ON DELETE CASCADE  
ON UPDATE CASCADE;

1) 如前所述,這里沒有太多經驗,所以我的問題是此外鍵究竟會做什么並防止發生這種情況? 我完全不使用它有什么區別?

ON DELETE CASCADE意味着我可以從topics表中刪除一條記錄,並且會自動刪除我的posts表中具有匹配的topic_id所有記錄? 如果是這樣,那真的很好,值得添加。

我不確定在這種情況下ON UPDATE CASCADE會做什么?

2)如果我的數據庫表是通過這樣的PHP代碼創建的...

$DiscussionPostsTableSql = "CREATE TABLE posts (
    ALL my COLUMN DEFINITIONS HERE....)";
$db->query($DiscussionTopicReplyTableSql);

那么我應該能夠以相同方式創建此外鍵嗎? 像這樣...

$foreignKeySql = "ALTER TABLE posts ADD FOREIGN KEY(parent_topic_id) REFERENCES topics(topic_id) ON DELETE CASCADE ON UPDATE CASCADE;)";
$db->query($foreignKeySql);

還是需要以其他方式添加?


主題表

CREATE TABLE topics (
  topic_id char(36) NOT NULL AUTO_INCREMENT,
  project_id char(36) NOT NULL,
  topic_subject VARCHAR(255) NOT NULL,
  topic_content TEXT default NULL,
  date_created DATETIME NOT NULL,
  date_last_post DATETIME NOT NULL,
  created_by_user_id char(36) NOT NULL,
  last_post_user_id char(36) NOT NULL,
  posts_count char(36) default NULL,
  PRIMARY KEY (topic_id)
) TYPE=INNODB;

帖子表

CREATE TABLE posts (
  post_id char(36) NOT NULL AUTO_INCREMENT,
  parent_topic_id char(36) NOT NULL,
  post_content TEXT NOT NULL,
  date_created DATETIME NOT NULL,
  created_by_user_id char(36) NOT NULL,
  PRIMARY KEY (post_id)
) TYPE=INNODB;

外鍵

// Add Foreign Key between Topic and Posts tables
ALTER TABLE posts
ADD FOREIGN KEY(parent_topic_id)  
REFERENCES topics(topic_id)  
ON DELETE CASCADE  
ON UPDATE CASCADE;

這個外鍵會阻止系統創建postsparent_topic_id不指向任何topic_idtopics表,無論是由錯誤或惡意。

ON DELETE CASCADE意味着每當您刪除topic ,所有相關posts都會隨之刪除。

ON UPDATE CASCADE意味着,如果您更新topic的ID,它將更新所有引用posts的ID。

至於創建鍵-如您所述,您應該在創建表本身的相同位置/方式中創建鍵。

注意:各種存儲引擎對外鍵支持有各種限制。 您正在使用的InnoDB是一個非常安全的選擇,但是您應該查看文檔以獲取全部詳細信息。

外鍵關系是規范化方法的一部分。

在這里,如果您不使用單獨的表格來發布帖子,那么主題重復就好像一個主題將有多個帖子一樣。

在這里,您具有用於帖子和主題的單獨表格,以及通過外鍵關系與帖子的連接主題。

這樣,您可以管理兩個表。 刪除主題將刪除與該主題相關的所有帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM