【发布时间】:2011-04-23 20:48:25
【问题描述】:
我创建了一个测试数据库,因为我需要切换到 InnoDB,因为我需要使用外键和事务。
我在 phpMyAdmin 中测试查询时由于某种原因得到不正确的结果。
我有一个 users 表,其中 uid 是主要/唯一(自动递增)和一个 user_profiles 表,其中 uid 是主/唯一的,是用户表中用户 uid 的外键,基本上链接到两个表中的 uid 列。
为了便于理解,这里有两张表:
CREATE TABLE `users` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status` char(10) NOT NULL DEFAULT 'verify',
`username` varchar(15) NOT NULL,
`email` varchar(50) NOT NULL,
`password` char(32) NOT NULL,
`reg_date` int(11) NOT NULL,
`ip` varchar(39) DEFAULT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
CREATE TABLE `user_profiles` (
`uid` int(10) unsigned NOT NULL,
`first_name` varchar(40) DEFAULT NULL,
`last_name` varchar(50) DEFAULT NULL,
`gender` char(6) DEFAULT NULL,
`website` varchar(100) DEFAULT NULL,
`msn` varchar(60) DEFAULT NULL,
`aim` varchar(60) DEFAULT NULL,
`yim` varchar(60) DEFAULT NULL,
`twitter` varchar(15) DEFAULT NULL,
PRIMARY KEY (`uid`),
CONSTRAINT `user_profiles_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
基本上我在 users 表中添加了一些虚拟记录,然后获取 users.uid 并在 user_profiles 中添加 uid 以链接两个表之间的虚拟记录。
现在我遇到的问题很奇怪,首先这是我在 phpMyAdmin 中使用的查询:
SELECT * FROM users INNER JOIN user_profiles
ON users.uid = '11'
基本上,该查询应该只是将用户和 user_profiles 表中的一个虚拟记录通过 uid 链接在一起。但奇怪的是它没有。即使其他 uid 不同,它也会返回所有记录,因为它们是唯一的,即使在查询结果中也是唯一的,它表明 uid 是唯一的,并且不一样,没有重复项,数据库也不允许这样做。
现在我不明白为什么,但它应该只返回 1 条记录,因为 uid 是唯一的,并且用户和 user_profiles 中只有一条记录的 uid 为 11(通过那里的 uid 将它们链接在一起)。奇怪的是它昨天工作正常。所以我决定删除测试表并重新开始但同样的事情。
有人知道发生了什么吗?
【问题讨论】:
标签: mysql innodb inner-join foreign-key-relationship