我正在用PHP和MySQL构建项目管理项目。我决定添加论坛类型讨论部分。我正在计划它与典型的论坛类似,但不是由不同的论坛主题/部分组成,而是由项目ID取代,因此我的项目管理软件中的每个项目都将拥有它自己的论坛部分。我的MySQL数据库表上的这个外键会为我做什么?
所以我真正需要的是一个主题帖子,然后是一个帖子回复。每个主题都会有一个主题/标题,然后身体/说明和任何跟进的帖子/答复将“信息”
所以我建立主题和帖子 MySQL数据库表
我的架构在下面。现在我有多年与这些数据库的工作,但我没有太多的经验与更多的花哨功能,如外键
所以我有这样的外键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;
的信息,我只是想确保我在正确的轨道上。另外,在查看我看到的内容后,我可以在创建表语句中创建外键非常酷 – JasonDavis 2014-10-01 05:42:05