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

Php 如何在MySQL中准确设置外键场景以完成我的地址簿,php,sql,Php,Sql,我一直在制作一个数据库,并一直在学习。我最近开始使用InnoDB并使用外键将表连接在一起 但老实说,我可能是在盲目地制作外键。制作外键时需要使用的正确设置和检查列表是什么 我对外键的理解是,我有一个主表,主表中的任何更改都会反映到任何将外键保存到其中特定列的表中 因此,我当前的登录系统设置如下 users ===== id PK username password contacts ======== id PK user_id references `users`.`id` group nam

我一直在制作一个数据库,并一直在学习。我最近开始使用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`
我的其他桌子看起来像这样

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选项删除主表时,可以删除这些表。正确吗

我现在的问题是,我似乎无法使用此设置将
组id
联系人id
设置为
组id
联系人id
的外键。我在运行SQL语句时出错

我正在尝试制作我的通讯簿,这样当用户将联系人放入一个组时,我就可以完全自动化,而不必更改太多信息。
group\u contact
表是我想在查看每个联系人所属位置时查询的内容。如果我更改组的名称,它将反映在所有表中,对吗?这就是外键出现的地方,我对这些键应该如何为我工作感到困惑

但是就像我说的,我似乎不能在做外键时不出错

我知道我可以用谷歌搜索我的外键问题,但如果没有得到反馈和输入,我似乎无法通过这种方式学习;(

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

这将真的帮助我很多家伙,我希望学到一些东西

我的问题是:

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`);
我的数据库如下所示:

CREATE TABLE `list_`.`buyer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL,
  `isClosed` tinyint(1) NOT NULL,
  `display_limit` int(1),
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  `prop_address` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `state` varchar(11) NOT NULL,
  `zip` varchar(5) NOT NULL,
  `cell_phone` varchar(16) NOT NULL,
  `home_phone` varchar(16) NOT NULL,
  `other1` varchar(16) NOT NULL,
  `other2` varchar(16) NOT NULL,
  `comments` text NOT NULL,
  `comment_exist` tinyint(1) NOT NULL,
  `comment_date` text NOT NULL,
  `date_added` date NOT NULL,
  `date_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`user_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 AUTO_INCREMENT=23 ;

CREATE TABLE `list_`.`company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL DEFAULT '0',
  `company_name` varchar(128) NOT NULL,
  PRIMARY KEY (`id`, `user_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

CREATE TABLE `list_`.`contacts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL,
  `group` varchar(128) NOT NULL,
  `first_name` varchar(128) NOT NULL,
  `last_name` varchar(128) NOT NULL,
  `address` varchar(128) NOT NULL,
  `city` varchar(128) NOT NULL,
  `state` varchar(2) NOT NULL,
  `zip` int(5) NOT NULL,
  `phone_number` varchar(16) NOT NULL,
  `cell_number` varchar(16) NOT NULL,
  `work_number` varchar(16) NOT NULL,
  `fax_number` varchar(16) NOT NULL,
  `email` varchar(128) NOT NULL,
  `company` varchar(55) NOT NULL,
  `title` varchar(56) NOT NULL,
  `notes` text NOT NULL,
  `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`user_id`),
  KEY `user_id` (`user_id`),
  KEY `group` (`group`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

CREATE TABLE `list_`.`groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL,
  `position` int(8) unsigned NOT NULL DEFAULT '0',
  `name` varchar(128) NOT NULL,
  `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`user_id`),
  KEY `user_id` (`user_id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ;

CREATE TABLE `list_`.`prospect` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL,
  `isClosed` tinyint(1) DEFAULT '0',
  `display_limit` int(1) DEFAULT '0',
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  `prop_address` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `state` varchar(11) NOT NULL,
  `zip` varchar(5) NOT NULL,
  `cell_phone` varchar(16) NOT NULL,
  `home_phone` varchar(16) NOT NULL,
  `other1` varchar(16) NOT NULL,
  `other2` varchar(16) NOT NULL,
  `comments` text NOT NULL,
  `date_added` date NOT NULL,
  `date_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`user_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

CREATE TABLE `list_`.`seller` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL,
  `file` int(11) DEFAULT NULL,
  `isClosed` tinyint(1) NOT NULL,
  `display_limit` int(1) NOT NULL DEFAULT '0',
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  `prop_address` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `state` varchar(22) NOT NULL,
  `zip` varchar(5) NOT NULL,
  `cell_phone` varchar(16) NOT NULL,
  `home_phone` varchar(16) NOT NULL,
  `other1` varchar(16) NOT NULL,
  `other2` varchar(16) NOT NULL,
  `comments` text NOT NULL,
  `comment_exist` tinyint(1) NOT NULL,
  `comment_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_added` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`user_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

CREATE TABLE `list_`.`settings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` tinyint(11) NOT NULL,
  `seller_display_limit` int(4) DEFAULT '0',
  `buyer_display_limit` int(4) DEFAULT '0',
  `prospect_display_limit` int(4) DEFAULT '0',
  `property_display_limit` int(4) DEFAULT '0',
  `date_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`user_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

CREATE TABLE `list_`.`users` (
  `id` tinyint(11) NOT NULL AUTO_INCREMENT,
  `md5_id` varchar(200) NOT NULL,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `user_level` tinyint(1) DEFAULT '1',
  `first_name` varchar(200) NOT NULL,
  `last_name` varchar(200) NOT NULL,
  `email` varchar(200) DEFAULT NULL,
  `approved` int(1) NOT NULL,
  `banned` int(1) NOT NULL,
  `date_joined` date NOT NULL,
  `ip` varchar(15) DEFAULT NULL,
  `activation_code` int(9) DEFAULT NULL,
  `ckey` varchar(220) NOT NULL,
  `ctime` varchar(220) NOT NULL,
  `last_logged_in` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `account_number` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

ALTER TABLE `list_`.`buyer`
  ADD CONSTRAINT `buyer_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE CASCADE;

-- 
-- Constraints for table `company`
-- 
ALTER TABLE `list_`.`company`
  ADD CONSTRAINT `company_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE CASCADE;

-- 
-- Constraints for table `contacts`
-- 
ALTER TABLE `list_`.`contacts`
  ADD CONSTRAINT `contacts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
  ADD CONSTRAINT `group_ibfk_2` FOREIGN KEY (`group`) REFERENCES `groups` (`name`) ON UPDATE CASCADE;

-- 
-- Constraints for table `groups`
-- 
ALTER TABLE `list_`.`groups`
  ADD CONSTRAINT `group_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);

-- 
-- Constraints for table `prospect`
-- 
ALTER TABLE `list_`.`prospect`
  ADD CONSTRAINT `prospect_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);

-- 
-- Constraints for table `seller`
-- 
ALTER TABLE `list_`.`seller`
  ADD CONSTRAINT `seller_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);

-- 
-- Constraints for table `settings`
-- 
ALTER TABLE `list_`.`settings`
  ADD CONSTRAINT `settings_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);

我认为您对组的概念有点误解。更改组的名称不应反映在任何其他表上,您只需更改组的表即可

假设您有这个简单的场景,其中一个
联系人
只能属于一个

Groups
id
group_name

Contacts
id
group_id   -> Groups.id
first_name
...
您的
联系人
没有关于
组名的信息
。您只需存储对
组的引用。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
这只会更改您的
表,而不会更改您的
联系人


您在
联系人上的外键。存在组id
以确保有效。这意味着,如果
组id=88
中没有记录,则不允许您与
组id=88
联系


一旦您删除了某个组,使用“删除级联”上的
将删除该组中的所有
联系人。

您可以发布用于创建表的sql查询吗?哪个错误?粘贴错误代码和错误消息。请更具体一些。请粘贴“显示创建表用户”\G等。呵呵,我有一些错误使用您提供的代码取消搜索谢谢。只是好奇。我如何将搜索限制为仅显示特定用户的结果。我的用户id引用users.id,以便我可以确保返回的数据属于所需用户