postgresql 如何防止CREATE TABLE IF NOT EXISTS失败与duplicate_table?

6qfn3psc  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(210)

我有一个PostgreSQL 14.7数据库,它有多个客户端,可以自动为表创建和删除分区。其中一个客户端无法创建表分区,它得到了一个42P07 duplicate_table错误:
关系“prc_739214”已存在
尽管它执行的查询类似于CREATE TABLE IF NOT EXISTS prc_739214 PARTITION OF prc FOR VALUES FROM ... TO ...;。我希望IF NOT EXISTS可以防止duplicate_table错误,但显然它们仍然可能发生。
有没有什么方法可以加强这个查询以避免duplicate_table错误?
作为参考,客户端收到来自epgsql(Erlang PG客户端库)的以下错误:

{error,
 error,
 <<"42P07">>,
 duplicate_table,
 <<"relation \"prc_739214\" already exists">>,
 [{file,<<"heap.c">>},
  {line,<<"1200">>},
  {routine,<<"heap_create_with_catalog">>},
  {severity,<<"ERROR">>}
 ]}

字符串

ct3nt3jp

ct3nt3jp1#

IF NOT EXISTS是用来处理幂等性的,而不是并发性的。如果两个会话试图同时创建同一个表,其中一个仍然会出错。
我不希望它是this错误,但是通过一个简单的测试,我看到在表是分区的情况下,确实这是错误的表现方式。
因此,为了防止这种情况,您需要使用某种锁来防止多个会话同时尝试创建同一个表。最好的方法取决于我们不了解的程序内部工作原理。可能是初始表名的哈希值上的建议锁,也可能是分区树的父表上的某种互斥锁。

相关问题