Mysql,删除未存在的条目

时间:2013-08-08 13:05:54

标签: mysql

让我们想象他有两张桌子

--
-- Table structure for table `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phoneID` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


--
-- Table structure for table `phone`
--

CREATE TABLE IF NOT EXISTS `phone` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userID` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

所以现在我需要创建这样的查询 - 我需要删除来自电话表的所有电话条目,其中userID不存在(意味着用户已从用户表中删除,并且没有这样的用户ID)仅使用一个查询。

我的想法:我们可以使用innerJoin来选择所有相同的条目然后我们需要从电话表中删除其他条目。

请帮忙。

WBR

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。但你需要的是一个执行“反连接”的查询,以获取phoneuser中没有匹配行的所有行。

首先编写查询:

SELECT p.*
  FROM `phone` p 
  LEFT
  JOIN `user` u 
    ON u.id = p.userID
 WHERE u.id IS NULL

请注意,这会执行左连接,因此它会说“从手机中获取所有行,以及来自用户的任何匹配行”。反连接的技巧是WHERE子句,它说“消除我们找到匹配的所有行”。所以我们剩下的是来自phone的{​​{1}}中没有匹配行的行。

验证这是您要删除的行集后,然后只需将SELECT关键字更改为DELETE:

user

http://dev.mysql.com/doc/refman/5.5/en/delete.html


顺便说一句:在每个表中引用另一个外键列有点不寻常。没有针对它的“规则”,但通常不需要通过在一个表或另一个表中使用外键来满足可满足的要求。在某些极端情况下,我们需要指向两个方向的外键,但这是一个罕见的例外。

答案 1 :(得分:0)

delete phone where userid not in (select user_id from user);

BTW PhoneID不应该是用户表中的字段。