我在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插入语法有什么问题吗?
答案 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
);
编辑:带有存储过程和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)
WHERE
是SELECT
语法的一部分。 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