To prevent data duplication, I tried to use the 'where not exists' syntax.
I can't set that column to a unique value. This only necessary in certain situations. Duplicate data is sometimes possible.
Here's my table test (id: Auto increment)
| id | val1 | val2 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
I tried this:
insert into test (val1, val2)
select 4, 4 from test
where not exists
(select * from test
where val1 = 4 and val2 = 4
limit 1);
Here's what I actually got:
| id | val1 | val2 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 4 | 4 |
| 6 | 4 | 4 |
Here's the result I was expecting:
| id | val1 | val2 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
And when I run the same query after that, the insertion didn't happen as I intended. However, if there is no duplicate data, only one row should be entered.
What should I do?
CodePudding user response:
What you wanted to do here is to not select from any table (or use dual if you do want a FROM clause:
INSERT INTO test (val1, val2)
SELECT 4, 4
WHERE NOT EXISTS (
SELECT 1
FROM test
WHERE val1 = 4 AND val2 = 4
);
Your current query will insert the tuple (4, 4) for every record in the test table, which isn't the behavior you want.
