【问题标题】:mysql query insert where not exists [duplicate]mysql查询插入不存在的地方[重复]
【发布时间】:2013-03-15 08:47:05
【问题描述】:

我搜索一种在数据库(MySQL)中输入数据的方法,如果它们在 DB 中尚不存在:类似于:

 INSERT INTO TABLE(id,name,surname) VALUES('','name1','surname1')
 WHERE NOT EXISTS (SELECT * FROM TABLE)

这个查询有什么问题?

【问题讨论】:

  • 你得到的错误是什么?

标签: mysql sql database


【解决方案1】:

假设您有如下定义的表:

+------+  +------+
|Names |  |Add   |
+------+  +------+
|ID    |  |ID    |
|FName |  |FName |
|LName |  |LName |
+------+  +------+

如果您想将 Add 表插入 Names 表而不添加重复项,您可以使用以下 select 语句为您需要的每个 insert 语句创建一行。这也带来了创建审计跟踪的额外好处。

Select CONCAT('INSERT INTO Names \(ID, FName, LName\) VALUES \(',a.ID,',',a.FName,',',a.LName,'\)')
From Add a LEFT JOIN Names N on a.ID = n.ID AND a.FName = n.FName AND a.LName = n.FName
Where n.ID is null;

我不确定我的语法是否完美,因为我不使用 mySQL,但它应该在球场上。

【讨论】:

    【解决方案2】:

    建议在询问之前先做好功课。如果您在 google 或 stackoverflow 中查找,您可以找到与您类似的问题:

    MySQL: Insert record if not exists in table

    我相信这会解决你的问题。

    明确一点:不,您不能在 INSERT 中使用 WHERE。但是是的,您可以锁定表以避免在它们存在的地方插入记录。这称为 CONSTRAINT,需要从表创建中声明。

    您需要的一切都在链接的问题中。

    【讨论】:

      【解决方案3】:

      虽然您不能将NOT EXISTS 用于上述查询,但您可以使用子查询。这是使用LEFT JOIN 和子查询的一种方法:

      INSERT INTO yourtable (name, surname) 
      SELECT a.name, a.surname
      FROM  
        (SELECT 'name1' name,'surname1' surname) a 
        LEFT JOIN yourtable b ON 
            a.name = b.name AND a.surname = b.surname
      WHERE b.name IS NULL;
      

      SQL Fiddle Demo

      还有NOT EXISTS 方法:

      INSERT INTO yourtable (name, surname) 
      SELECT a.name, a.surname
      FROM  
        (SELECT 'name1' name,'surname1' surname) a 
      WHERE NOT EXISTS (
             SELECT 1 
             FROM yourtable 
             WHERE name = 'name1' and surname = 'surname1')
      

      More Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-18
        • 2020-12-16
        • 1970-01-01
        • 2018-01-04
        • 2012-05-31
        • 1970-01-01
        • 2017-08-29
        • 2013-03-31
        相关资源
        最近更新 更多