两个同时运行“CREATE TABLE”的会话有点古怪:
http://postgresql.1045698.n5.nabble.com/Errors-on-CREATE-TABLE-IF-NOT-EXISTS-td5659080.html
CREATE TABLE 进行初步检查以查看是否存在名称冲突。如果是这样,它要么出错(通常),要么退出并发出通知(在 IF NOT EXISTS 情况下)。但是有一个竞争条件:一个冲突的事务可以在我们进行检查之后和我们自己创建之前创建表。
链接的线程发起者和我都在自动化测试环境中遇到了这个问题,所以这只不过是一个烦恼。(我怀疑它会影响您的架构迁移,但它可以被视为对 ddl 更改的限制)
perl -MDBI -E 'fork; fork; $d=DBI->connect("dbi:Pg:dbname=$ENV{USER}");' \
$d->do("CREATE TABLE a (b int)")'
DBD::Pg::db do failed: ERROR:
duplicate key value violates unique constraint "pg_type_typname_nsp_index"
DETAIL: Key (typname, typnamespace)=(a, 2200) already exists. at -e line 1.