2016-01-29 6 views
0

Я пытаюсь вставить несколько строк одновременно и проверить, существуют ли они. Я хочу обновить, если они существуют, иначе вставьте.Инструкция MySQL для вставки, если не существует else update

Мой первичный ключ: «ID». Я не хочу использовать уникальный индекс для столбца «запрос».

То, что я хочу, чтобы вставить/обновление:

INSERT INTO my_table (query, keyword) VALUES ('home', 'home-link'); 
INSERT INTO my_table (query, keyword) VALUES ('contact', 'contact-link'); 

мой стол:

-------------------------------- 
ID | query | keyword  | 
-------------------------------- 
1 | home | home-link  | 
-------------------------------- 
2 | contact | contact-link | 
-------------------------------- 

Я попробовал это, но это дает мне SQL синтаксис ошибки # 1064:

IF EXISTS(SELECT query FROM my_table WHERE query='home') 
THEN 
UPDATE my_table SET query='home' AND keyword='home-link' WHERE query='home' 
ELSE 
INSERT INTO my_table (query, keyword) VALUES ('home', 'home-link') 
END IF 


IF EXISTS(SELECT query FROM my_table WHERE query='contact') 
THEN 
UPDATE my_table SET query='contact' AND keyword='contact-link' WHERE query='contact' 
ELSE 
INSERT INTO my_table (query, keyword) VALUES ('contact', 'contact-link') 
END IF 
+0

Почему невозможно добавить первичный ключ или, по крайней мере, уникальный ключ, так что вы можете использовать 'insert ... on duplicate key update ...'? – Shadow

ответ

0

Предполагая, что у вас есть уникальный индекс в столбце query в вашей таблице, вы можете сделать upsert следующим образом:

insert into my_table (query, keyword) values ('home', 'home-link') 
on duplicate key update 
keyword = values(keyword) 

Подробнее: http://mechanics.flite.com/blog/2013/09/30/how-to-do-an-upsert-in-mysql/

+0

К сожалению, у меня есть индекс первичного ключа для идентификатора (auto increment) – Dejavu

+0

Вы все же можете добавить уникальный индекс в столбец 'query', предполагая, что вы хотите применить уникальность в этом столбце. –

+0

Конечно, я хочу сделать запрос уникальным и обновить, если он существует, но так как я собираюсь использовать его для opencart, я не хочу испортить таблицу. Можно ли это сделать без добавления уникального индекса? – Dejavu

0

Если вы не добавить уникальный индекс к query колонку, то вы не можете сделать upsert, используя только SQL. Необязательный условный синтаксис не поддерживается.

Вы можете написать хранимую процедуру для этого или использовать язык сценариев (bash, python и т. Д.).

Другой вариант - установить common_schema и использовать conditional logic in QueryScript. Вот пример использования common_schema QueryScript:

call common_schema.run(" 
    if (
    select count(*)=0 
    from test.my_table 
    where query='home' 
) 
    { 
    insert into test.my_table (query, keyword) values ('home', 'home-link'); 
    } 
    else 
    { 
    update test.my_table set keyword='home-link' where query='home'; 
    } 
"); 
+0

Теперь я вижу, как это работает. Я думаю, сначала я удалю строку, а затем вставьте новую :) – Dejavu

0

Я решил удалить запись, а затем вставить новый один

DELETE FROM my_table WHERE query = 'home'; 
INSERT INTO my_table (query, keyword) VALUES ('home', 'home-link'); 
Смежные вопросы