Gogre程序中的Postgres``在不存在的地方插入''

时间:2019-02-18 20:37:33

标签: postgresql

我在Golang程序中遇到“在不存在的地方插入”查询。这是我的Go函数:

func (dr *dbrepo) InsertData(datacenter, model, mgmt, data string) error {
    insertSource := `
INSERT INTO source (datacenter, model, mgmt, data)
VALUES ($1, $2, $3, $4)
WHERE NOT EXISTS (SELECT mgmt FROM source WHERE mgmt = $3)`

_, err := dr.db.Exec(insertSource, datacenter, model, mgmt, data)

if err != nil {
    return err
}

return nil

}

它给出的是:ERROR: syntax error at or near "WHERE" at character 77

任何想法我的postgresql插入语法有什么问题吗?

2 个答案:

答案 0 :(得分:0)

如果mgmt不超过一个,则表示它是唯一的,如果唯一,则可以在插入命令中添加ON CONFLICT:

INTO source (datacenter, model, mgmt, data)
VALUES ($1, $2, $3, $4)
ON CONFLICT(mgmt) DO NOTHING

在创建表时将mgmt创建为唯一:

create TABLE IF NOT EXISTS source (
    ...
    source text UNIQUE
); 

详细了解hereunique

编辑:带有存储过程和plpgsql的第二个选项:

 create or replace function insert_if_not_mgmt(_datacenter text, _model text, _mgmt text, _data text) returns boolean as $$
begin
  if not exists (SELECT true FROM source s WHERE s.mgmt = _mgmt) then
    INSERT INTO source (datacenter, model, mgmt, data)
    VALUES (_datacenter, _model, _mgmt, _data);
    return true;
  end if;
  return false;
end;
$$ language plpgsql;

数据类型只是一个例子

答案 1 :(得分:0)

WHERESELECT语法的一部分。 INSERT ... VALUES没有INSERT ... <query>子句。

相反,您可以使用INSERT INTO source (datacenter, model, mgmt, data) SELECT * FROM ( VALUES ($1, $2, $3, $4) ) AS vals (datacenter, model, mgmt, data) WHERE NOT EXISTS ( SELECT 1 FROM source WHERE source.mgmt = vals.mgmt ); 变体,您的查询将从VALUES expression中选择:

SELECT @@Version