防止插入重复值 Postgres

preventing insert on duplicate values Postgres

我正在使用此 SQL 语句构建距离矩阵:

INSERT INTO tabel (start, end, agg_cost)

SELECT * FROM pgr_dijkstraCostMatrix(
    'SELECT id, source, target, cost, reverse_cost FROM edges',
    (SELECT array_agg(id) FROM vertices 
     WHERE (vertices.eout =1)  OR (vertices.eout >15) ) 
);

效果很好。

当 'start' 和 'end' 的组合已存在于 table 中时,如何防止 INSERT? 我正在寻找另一个 WHERE 子句,但找不到将它放在哪里。

如果 UPSERT 不是一个选项,您可以尝试将此条件包含在 SELECT 中,例如

INSERT INTO tabel (start, end, agg_cost)
SELECT * FROM pgr_dijkstraCostMatrix(
    'SELECT id, source, target, cost, reverse_cost FROM edges',
    (SELECT array_agg(id) FROM vertices 
     WHERE (vertices.eout =1)  OR (vertices.eout >15) ) 
) q WHERE NOT EXISTS (
            SELECT 1 FROM tabel t 
            WHERE t.start = q.start AND
                  t.end = q.end);

演示:db<>fiddle

How do I prevent INSERT when the combination of 'start' and 'end' already exist in table?

首先创建唯一索引或约束,然后使用 on conflict:

create unique index unq_tabel_start_end on tabel(start_end);

INSERT INTO tabel (start, end, agg_cost)
    SELECT *
    FROM pgr_dijkstraCostMatrix(
             'SELECT id, source, target, cost, reverse_cost FROM edges',
             (SELECT array_agg(id)
              FROM vertices 
              WHERE vertices.eout = 1 OR vertices.eout > 15
             )
                              ) 
    ON CONFLICT (start, end) DO NOTHING;

您也可以根据需要更新现有行,而不是忽略新数据。