关于数据库:在“DROP SCHEMA public”之后无法创建新表

Cannot create a new table after “DROP SCHEMA public”

因为我想丢掉一些桌子,有人建议我这样做:

1
2
3
4
postgres=# DROP schema public cascade;
DROP SCHEMA
postgres=# CREATE schema public;
CREATE SCHEMA

然后我在创建新数据库时遇到问题,例如:

1
2
3
4
5
6
postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \c test
You are now connected TO DATABASE"test" AS USER"postgres".
test=# CREATE TABLE hi(id INT PRIMARY KEY);
*ERROR:  no schema has been selected TO CREATE IN*

你可以看到我出错了

ERROR: no schema has been selected to create in*

如何还原公共架构?如果我们不知道如何恢复,我建议人们永远不要做"删除模式公共级联"。有人能帮我吗?


当找不到search_path中的模式时,会弹出错误消息。要么是配置错误。你能得到什么?

1
SHOW search_path;

或者您从标准系统数据库template1中删除了public模式。运行drop schema public cascade;时,您可能连接到了错误的数据库。

顾名思义,这是用于创建新数据库的模板。因此,每个新数据库开始时都没有(默认)模式public,而您的默认search_path中可能包含"public"。

只需运行(作为超级用户public或查看mjojohn的答案):

1
CREATE SCHEMA public;

在数据库template1中(或任何其他需要它的数据库中)。

DROP SCHEMA ... CASCADE的建议,以尽快摧毁其中的所有物体,否则是有效的。


如果您有一个应用程序用户(如"postgres")并以不同的用户身份运行drop/create命令,那么该建议可能会导致一些问题。例如,如果您以"johndoe@localhost"的身份登录,只需点击psql mydatabase,就会发生这种情况。如果这样做,新模式的所有者将是johndoe,而不是"postgres",当您的应用程序来创建它需要的表时,它将看不到新模式。

要将所有权返还给应用程序的用户(假设用户是"postgres"),只需运行(与本地用户形成相同的psql提示):

1
ALTER SCHEMA public OWNER TO postgres;

你会准备好的。