【问题标题】:InnoDB returning strange results?InnoDB 返回奇怪的结果?
【发布时间】: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


    【解决方案1】:

    您没有链接 ON 上的表格。

    你没有提到 user_profiles 的任何内容,这就是为什么它需要所有这些。

    您需要在 ON 子句中加入连接条件,并在 where 中加入等号。

    查询应为:

    SELECT * 
    FROM   users 
           INNER JOIN user_profiles 
             ON users.uid = user_profiles.uid 
    WHERE  users.uid = '11' 
    

    【讨论】:

    • 哦,天哪,我意识到现在我出于某种原因认为 ON 是 WHERE,我简直不敢相信。我把头发拔了出来,以为昨天有用,哈哈。谢谢! :)
    【解决方案2】:

    你想加入usersuser_profiles的uid,但这不是你做的,你加入了user_profileson users.uid = '11'
    这当然对user_profiles 没有影响,因为你还没有建立用户和user_profiles 之间的关系。

    变化:

    SELECT * FROM users INNER JOIN user_profiles
    ON users.uid = '11'
    

    收件人:

    SELECT * FROM users 
    INNER JOIN user_profiles ON (users.uid = user_profiles.uid)
    WHERE users.uid = '11'
    

    现在您已经说明了用户和他们的个人资料之间的关系(uid 的匹配),然后您进一步声明您只需要具有 uid 11 的用户。

    【讨论】:

      【解决方案3】:

      在ON子句中,必须指定两个表的连接字段,而不是过滤条件,如SELECT * FROM users INNER JOIN user_profiles ON users.uid = user_profiles.uid。 之后,你可以像往常一样添加 WHERE 子句,比如WHERE users.uid = '11'

      【讨论】:

        猜你喜欢
        • 2012-08-08
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多