无法关联两个 MySQL 表(外键)

Posted

技术标签:

【中文标题】无法关联两个 MySQL 表(外键)【英文标题】:Unable to relate two MySQL tables (foreign keys) 【发布时间】:2011-03-03 05:16:12 【问题描述】:

这是我的USER

如果不存在“用户”,则创建表( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL, `expiry` varchar(6) NOT NULL, `contact_id` int(11) 非空, `email` varchar(255) NOT NULL, `password` varchar(100) NOT NULL, `level` int(3) NOT NULL, `active` tinyint(4) NOT NULL DEFAULT '1', 主键(`id`,`email`) ) 引擎=InnoDB 默认字符集=latin1 AUTO_INCREMENT=1 ;

这是我的contact_info表

如果不存在`contact_info`,则创建表( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email_address` varchar(255) NOT NULL, `company_name` varchar(255) NOT NULL, `license_number` varchar(255) NOT NULL, `phone` varchar(30) NOT NULL, `fax` varchar(30) NOT NULL, `mobile` varchar(30) NOT NULL, `category` varchar(100) NOT NULL, `country` varchar(20) NOT NULL, `state` varchar(20) NOT NULL, `city` varchar(100) NOT NULL, `postcode` varchar(50) NOT NULL, 主键(`id`,`email_address`), ) 引擎=InnoDB 默认字符集=latin1 AUTO_INCREMENT=1 ;

系统使用用户名登录用户。我想以使用电子邮件登录的方式对其进行修改。但是 users 表中没有 email_address。

我在用户表中添加了外键-电子邮件(即contact_info中的email_address)。

我应该如何查询数据库?

【问题讨论】:

您真的希望每个用户有两个电子邮件地址吗?还是两个表之间是一对多的关系? 【参考方案1】:

不,不,不,不,不。说真的,没有。不要让我过来:-)

您通过存储电子邮件地址两次来破坏第三范式。

关系只需很短,即id。假设您不保证两个表中的 ID 相同(即我的users.id 不一定等于我的contact_info.id),只需在users 表中添加一个ci_id 以充当contact_info 表的外键。

那么获取用户usernameemail 的查询将类似于:

select u.username, ci.email
from users u, contact_info ci
where u.username = 'paxdiablo'
and u.ci_id = ci.id;

【讨论】:

使用 ANSI 默认的相同 SQL 查询:选择 u.username, ci.email from users inner join contact_inf ci on cid.id = u.cid_id where u.username = 'someone';这两种方式都很好,但是当表连接很多时,更容易知道搜索条件和表连接在哪里。

以上是关于无法关联两个 MySQL 表(外键)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中如何在关联表中查询出其中一个外键不存在的数据?

MySQL — 关联

mysql 删除表 外键出错

MYSQL数据库中三个数据表如何实现关联

sql 关联查询外键为空的情况

mysql清表时有外键关联处理办法