用于插入的MySQL语句如果不存在则更新

时间:2016-01-29 13:52:39

标签: mysql

我试图同时插入多行并检查它们是否存在。我想更新它们是否存在,否则插入。

我的主键是“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

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

如果您没有为query列添加唯一索引,则只能使用SQL执行upsert。您尝试的条件语法不受支持。

您可以编写存储过程来执行此操作,或使用脚本语言(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';
  }
");

答案 2 :(得分:0)

我决定删除记录,然后插入新记录

DELETE FROM my_table WHERE query = 'home';
INSERT INTO my_table (query, keyword) VALUES ('home', 'home-link');