防止插入重复值 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;
您也可以根据需要更新现有行,而不是忽略新数据。
我正在使用此 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;
您也可以根据需要更新现有行,而不是忽略新数据。