假设我有一个带约束的表的更新查询(Postgres 11)。我不知道这些约束,因此无法确定更新查询是否会失败。如果更新查询由于冲突而失败,我不想做任何事情并返回0(没有更新任何行)。有了一个插入,你可以有'插入. ON CONFLICT DO NOTHING“,但此选项在更新查询中不存在。有解决办法吗?
f2uvfpb91#
您可以尝试使用CTE获取UPDATE语句的结果,然后使用RETURNING *返回更新的行,但如果由于冲突而失败,则不会返回任何内容。
UPDATE
RETURNING *
WITH updated_rows AS ( UPDATE your_table SET column1 = 'new_value' WHERE condition RETURNING *)SELECT COUNT(*) AS rows_updated FROM updated_rows;
WITH updated_rows AS (
UPDATE your_table
SET column1 = 'new_value'
WHERE condition
)
SELECT COUNT(*) AS rows_updated FROM updated_rows;
cl25kdpy2#
这不是一个直接的答案,但没有理由做出这样的声明:* 我不知道...所以我不能...* 相反,这应该引发一个问题:* 我该怎么...* 在这种情况下,这将是,我如何确定一个表上的约束?* 以下是其中一种方法:
select table_name, constraint_name, constrant_definition from (select distinct on(con.conrelid::regclass::text,con.conname,con.contype) con.conrelid::regclass::text table_name , con.conname constraint_name , con.contype , pg_get_constraintdef(con.oid) constrant_definition from pg_catalog.pg_constraint con join pg_catalog.pg_class rel on rel.oid = con.conrelid join pg_catalog.pg_namespace nsp on nsp.oid = con.connamespace where nsp.nspname = 'public' and rel.relname = 'non_standard_calendar' ) sq order by table_name , case when contype = 'p' then 1 when contype = 'u' then 2 when contype = 'f' then 3 when contype = 'c' then 4 else 5 end;
select table_name, constraint_name, constrant_definition
from (select distinct on(con.conrelid::regclass::text,con.conname,con.contype)
con.conrelid::regclass::text table_name
, con.conname constraint_name
, con.contype
, pg_get_constraintdef(con.oid) constrant_definition
from pg_catalog.pg_constraint con
join pg_catalog.pg_class rel on rel.oid = con.conrelid
join pg_catalog.pg_namespace nsp on nsp.oid = con.connamespace
where nsp.nspname = 'public'
and rel.relname = 'non_standard_calendar'
) sq
order by table_name
, case when contype = 'p' then 1
when contype = 'u' then 2
when contype = 'f' then 3
when contype = 'c' then 4
else 5
end;
然后,有了这些信息,你可以提出一个更好的问题,你的问题,或使问题静音。
2条答案
按热度按时间f2uvfpb91#
您可以尝试使用CTE获取
UPDATE
语句的结果,然后使用RETURNING *
返回更新的行,但如果由于冲突而失败,则不会返回任何内容。cl25kdpy2#
这不是一个直接的答案,但没有理由做出这样的声明:* 我不知道...所以我不能...* 相反,这应该引发一个问题:* 我该怎么...* 在这种情况下,这将是,我如何确定一个表上的约束?* 以下是其中一种方法:
然后,有了这些信息,你可以提出一个更好的问题,你的问题,或使问题静音。