如果值不存在,则插入连接表

Posted

技术标签:

【中文标题】如果值不存在,则插入连接表【英文标题】:Inserting into a join table if value does not already exist 【发布时间】:2016-08-11 11:47:32 【问题描述】:

我有 2 个表 - 用户、区域和一个用于连接用户和区域的连接/连接表。

我需要将用户尚未拥有的所有区域值插入到连接表中,但我不确定如何去做。

我尝试了很多方法,但我不完全确定如何仅将表中已经存在的值放入连接表中。有人有什么想法或建议吗?

SELECT 
    CONVERT( CONCAT('INSERT INTO user_region VALUES(',
        user.id,
        ',',
        reg.id,
        ');') USING UTF8)
FROM
   user user
      JOIN
        user_region user_reg ON user_reg.id = user.id
      JOIN
        region reg ON reg.id = user_reg.id
WHERE 
   (user.email_address LIKE '%gmail%'
    OR user.email_address LIKE '%hotmail%');


 User Table                User Region             Region
 -----------               -----------             ------
 1                          1        2             1
 2                          3        2             2
 3                          3        4             3
 4                          4        3             4

【问题讨论】:

做 LEFT JOIN 并且在 WHERE 条件下有 reg.ID IS NULL .. 这样您将只获得用户没有的区域...如果您向我们展示一些数据,我们可以帮助您甚至更多,但这只是我将如何使用它的想法 感谢您的回复。我不完全确定我是否遵循 - 所以我必须使用左连接而不是仅仅连接,并且还要更改我的 where 条件以检查 reg.is 是否为空? 你能不能举一些数据例子? 是的。 @Veljko89 是对的。他已经解释了它是如何工作的。 这是否意味着我必须重写查询以适应 regid= null 条件?每当我尝试将其放入 where 子句时,它都会引发错误。 【参考方案1】:

种类

INSERT INTO user_region (userID, regionID)
SELECT u.userID, r.regionID
FROM
(SELECT DISTINCT userId 
FROM user 
WHERE user.email_address LIKE '%gmail%'
    OR user.email_address LIKE '%hotmail%') u
JOIN region r ON NOT EXISTS (
     SELECT 1 
     FROM user_region ur
     WHERE ur.userID = u.userID AND ur.regionID = r.regionID )

【讨论】:

以上是关于如果值不存在,则插入连接表的主要内容,如果未能解决你的问题,请参考以下文章

如果表不存在,则插入其他表

MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]

MySQL 仅在表不存在时插入数据

Laravel 模型 - 如果数据库表不存在则返回 null

如果存在则插入仅在表中有记录时才有效

访问:如果表不存在则创建表