mysql查询插入不存在的地方

时间:2013-03-25 18:29:54

标签: mysql sql database

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

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

此查询有什么问题?

3 个答案:

答案 0 :(得分:7)

虽然您无法在上述查询中使用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

答案 1 :(得分:0)

建议在做作业之前做好功课。如果您查看谷歌或stackoverflow,您可以找到类似的问题:

MySQL: Insert record if not exists in table

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

要明确:不,您不能在INSERT中使用WHERE。但是,您可以锁定表以避免在存在的位置插入记录。这称为CON​​STRAINT,需要从表创建声明。

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

答案 2 :(得分:0)

让我们假设你的表定义如下:

+------+  +------+
|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,但它应该在球场上。