1

I search a way to enter datas in database(MySQL),if they dont exist yet in DB:something like:

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

What wrong with this query ?

1
  • What is the error you get? Commented Mar 25, 2013 at 18:36

3 Answers 3

8

While you can't use NOT EXISTS with your above query, you can with a subquery. Here's one way to do it using a LEFT JOIN and a subquery:

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

And the NOT EXISTS approach:

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

Sign up to request clarification or add additional context in comments.

Comments

0

There's a recommendation of doing your homework before asking. If you look in google or in stackoverflow, you can find a similar question to yours:

MySQL: Insert record if not exists in table

I believe that would solve your issue.

To be clear: No, you cannot use WHERE in an INSERT. But YES, you can lock tables to avoid inserting records where they exists. That is called a CONSTRAINT and needs to be declared from the table creation.

Everything you need is in the linked question.

Comments

0

Lets say you have tables defined as follows:

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

If you wanted to insert the Add table into the Names table without adding duplicates you could use the following select statement to create a line for each insert statement you need. This also gives the extra benefit of creating an audit trail.

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;

I'm not sure I have the syntax perfect as I don't use mySQL, but it should be in the ballpark.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.