如何在MySQL中准确设置外键场景来完成我的地址簿

时间:2010-10-13 01:13:31

标签: php sql

我一直在制作数据库并学习。我最近开始使用InnoDB并使用外键将表连接在一起。

但老实说,我可能会盲目地制作我的外键。制作外键时需要使用的正确设置和检查列表是什么。

我对外键的理解是我有一个主表,我的主表中的任何更改都会反映到任何包含外键到其中特定列的表中。

所以我当前的登录系统有这样的设置

users
=====
id PK
username
password

我的其他表格看起来像这样

contacts
========
id PK
user_id references `users`.`id`
group
name
address

groups
======
id PK
user_id
group_name

group_contacts
==============
id PK
group_id references `group`.`id`
contact_id references `contacts`.`id`

根据我的理解,当使用ON DELETE CASCADE选项删除主表时,可以删除这些表吗?

我现在的问题是,我似乎无法将group_idcontact_id设为groupsidcontacts的外键。{{ 1}}使用此设置。运行SQL语句时出错。

我正在尝试制作我的地址簿,以便当用户将联系人放入群组时变得全自动化,而且我不需要更改太多信息。当我想查看每个联系人所属的位置时,我认为我会查询id表。如果我更改组的名称,它将反映在所有表中吗?这就是外键进入的地方,我对这些键应该如何表现我感到困惑。

但就像我说的那样,如果没有出错,我似乎无法制作外键。

我知道我可以谷歌我的外键问题,但我似乎无法通过这种方式学习而没有获得反馈并输入我的确切情景;(

不要问太多,但由于我的困惑,我也很难看到如何制作PHP脚本来处理组名更改并查询数据库以下拉属于特定的联系人基。

这对我很有帮助,我希望能学到一些东西!

我的疑问是:

group_contact

我的数据库如下所示:

ALTER TABLE `list_`.`groups_contacts`
    ADD CONSTRAINT `group_id` FOREIGN KEY (`group_id`) REFERENCES `list_`.`groups` (`id`)
    ADD CONSTRAINT `contact_id` FOREIGN KEY (`contact_id`) REFERENCES `list_`.`contacts` (`id`);

1 个答案:

答案 0 :(得分:2)

我认为你略微误解了Foreign Keys的概念。更改组的名称不应该反映在任何其他表上,只需更改组表即可。

假设您有这个简单的场景,其中一个Contact只能属于一个Group

Groups
id
group_name

Contacts
id
group_id   -> Groups.id
first_name
...

您的Contacts没有关于group_name的信息。您只需将引用存储到Groups.id

如果要查询联系人及其组的名称,请加入这两个表:

Select c.first_name, g.group_name
From contacts c
Join groups g On ( g.id = c.group_id )

如果要更改组的名称,请执行简单的更新:

Update groups
Set group_name = 'Your new group name'
Where id = 99 --# The id of the group to rename

这只会更改您的Groups表格,而不会更改您的Contacts


Contacts.group_id上的外键是为了确保referential integrity。这意味着,如果group_id=88中有Groups的记录,则不允许您与id=88建立联系。

删除该群组后,使用ON DELETE CASCADE会删除属于某个群组成员的所有Contacts