使用外键来"同步"会员信息

时间:2016-07-24 08:56:12

标签: mysql database web-applications

我现在主要试图围绕外键的想法,但我在网上看到的并不像我需要的那样有用。

我有一个数据库(让我们称之为user_data)。在该数据库中,我有一个members表,我有一个contact表。会员表包含电子邮件,用户名和登录的数据,其中联系信息包含用户的姓名和电话号码(是的,在我们讨论是否需要电话号码之前,我这样做)

所以,我有这样的事情:

CREATE TABLE `members` (
    `id` int(11) NOT NULL PRIMARY KEY,
    `username` varchar(30) NOT NULL,
    `email` varchar(50) NOT NULL,
    `password` char(128) NOT NULL,
    `user_type` int(11) NOT NULL DEFAULT '0'
);

CREATE TABLE `contact_info` (
    `t_ID` int(11) NOT NULL,
    `First` varchar(50) DEFAULT NULL,
    `Last` varchar(50) DEFAULT NULL,
    `Phone` int(11) DEFAULT NULL
);

在'成员'表格,用id标识用户,在联系表格中可以找到用户的联系信息'通过比较members.id = contact_info.t_id

据我所知,外键在这里可以很好地工作,但是我无法弄明白我需要做什么才能使工作......或者更确切地说,我我不太了解外键了解我需要做什么。 members.idcontact_info.t_id之间的关系是一对一的......一个用户只有一个联系人组,只有一个。

我正在学习SQL,所以我几乎离开了我的联盟,我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

以相反顺序删除与FK相关的表:

drop table if exists `contact_info`;
drop table if exists `members`;

<强>架构:

CREATE TABLE `members` (
    `id` int(11) AUTO_INCREMENT PRIMARY KEY,
    `username` varchar(30) NOT NULL,
    `email` varchar(50) NOT NULL,
    `password` char(128) NOT NULL, -- this needs to be bigger. Hashed value.
    `user_type` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB;

CREATE TABLE `contact_info` (
 `id` int(11) AUTO_INCREMENT PRIMARY KEY,
 `m_id` int(11) NOT NULL, -- points to `members`.`id` (See Note1 *** )
  `First` varchar(50) DEFAULT NULL,
  `Last` varchar(50) DEFAULT NULL,
  `Phone` int(11) DEFAULT NULL,
  CONSTRAINT `contact_info_ibfk_1` FOREIGN KEY (`m_id`) REFERENCES `members` (`id`)
) ENGINE=InnoDB;

那应该是你在我的问题中阅读的模式。它支持1:1和1:很多。在members中插入一行后,如果您想立即跟进插入AUTO_INCREMENT,请调用LAST_INSERT_ID()以获取该密钥的contact_info

注1 :如果你想要1:1,那么你需要一个唯一的密钥(显然它将是一个PK)。但我认为你仍然对这件事感到困惑,1:1或1:很多。

执行后的视图:

CREATE TABLE `contact_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `m_id` int(11) NOT NULL,
  `First` varchar(50) DEFAULT NULL,
  `Last` varchar(50) DEFAULT NULL,
  `Phone` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `contact_info_ibfk_1` (`m_id`), -- NOTE2 ************
  CONSTRAINT `contact_info_ibfk_1` FOREIGN KEY (`m_id`) REFERENCES `members` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如果您要运行show create table contact_info,您可能会看到上述情况。将自动创建 Note2 键(索引)以支持外键关系。

尽管有问题的评论,InnoDB将强制执行FK约束。如果您不这么认为,请先尝试将数据添加到contact_info

请参阅名为Using FOREIGN KEY Constraints的MySQL手册页。