我现在主要试图围绕外键的想法,但我在网上看到的并不像我需要的那样有用。
我有一个数据库(让我们称之为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.id
和contact_info.t_id
之间的关系是一对一的......一个用户只有一个联系人组,只有一个。
我正在学习SQL,所以我几乎离开了我的联盟,我真的很感激任何帮助。
答案 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手册页。