[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🍭(二)
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
🗻 简介:
往期精选文章,求赞求关注!
🗺️ PG系列文章:
PG系列文章,想学习更多PG芝士,快来吧🦸🏻♂️!
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🔥 (一)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🍭(二)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🍌 (三)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🎵(四)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL✒️(五)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🔬(六)
总结: 在本文中,将学习PostgreSQL schema以及如何使用schema搜索路径、解析schema中的对象。
🐔 🐓 🐤 🐥 🐣
🐔PostgreSQL schema是什么
在PostgreSQL中,schema是一个命名空间,其中包含名为database的对象,例如表,视图,索引,数据类型,函数,存储过程和标识符。
要访问schema中的对象,我们需要使用以下语法对对象进行限定:
schema_name.object_name
一个数据库可以包含一个或多个schema,并且每个schema仅属于一个数据库。两个schema可以具有共享相同名称的不同对象。
例如,你可能有test
schema ,user
表,public
schema也具有user
表。当你提到user
表你必须限定如下:
public.user
Or
test.user
🐔为什么需要使用schema
🐓为什么需要使用schema:
-
Schema允许我们将数据库对象 (例如表) 组织到逻辑组中,以使它们更易于管理。
-
Schema使多个用户能够使用一个数据库而不会相互干扰。
🐔public
schema
对于每个新数据库,PostgreSQL自动创建一个名为public
schema。无论我们创建的对象有没有指定schema名称,PostgreSQL都会将其放入public
schema。因此,以下语句是等效的:
CREATE TABLE table_name(
...
);
和
CREATE TABLE public.table_name(
...
);
🐔schema搜索路径
实际上,引用没有其schema名称的表,例如,user
表而不是完全限定的名称,例如test.user
表。
当仅使用表的名称引用表时,PostgreSQL使用schema搜索路径,这是要查找的schema列表。
PostgreSQL将访问schema搜索路径中的第一个匹配表。如果没有匹配项,它将返回错误,即使该名称存在于数据库中的另一个schema中。
搜索路径中的第一个schema称为当前schema。请注意,当我们在未显式指定schema名称的情况下创建新对象时,PostgreSQL还将为新对象使用当前schema。
current_schema()
函数返回当前schema:
SELECT current_schema();
Output
current_schema
----------------
public
(1 row)
这就是为什么对于我们创建的每个新对象,PostgreSQL使用public
修饰。
在psql
工具要查看当前搜索路径,请使用show
命令:
SHOW search_path;
Output
search_path
-----------------
"$user", public
(1 row)
🐣在此输出中:
"$ user"
指定PostgreSQL将用于搜索对象的第一个schema,该对象与当前用户具有相同的名称。例如,如果我们使用postgres
用户登录并访问user
表。PostgreSQL将在postgres
schema搜索user
表。如果找不到这样的对象,它将继续在public
schema搜索user
表。- 第二个要素是指
public
我们之前已经看到的模式。
要创建新schema,请使用CREATE SCHEMA
声明:
CREATE SCHEMA test;
要将新schema添加到搜索路径,请使用以下命令:
SET search_path TO test, public;
现在,如果我们创建一个名为user
不指定schema名称,PostgreSQL将把它user
表到test
schema:
CREATE TABLE user(
user_id SERIAL PRIMARY KEY,
name VARCHAR(45) NOT NULL
);
在test
schema访问user
表我们可以使用以下语句之一:
SELECT * FROM user;
Or
SELECT * FROM test.user;
public
schema是搜索路径中的第二个元素,因此在public schema中要访问user
表,我们必须限定表名,如下所示:
SELECT * FROM public.staff;
如果使用以下命令,则需要显式引用public
使用完全限定名称的schema:
SET search_path TO public;
🐣
public
schema不是特殊的schema, 所以你可以删除他
🐔PostgreSQL schemas 和 权限
用户只能访问其拥有的schema中的对象。这意味着它们无法访问schema中不属于它们的任何对象。
要允许用户访问其不拥有的schema中的对象,必须授予USAGE
schema权限
GRANT USAGE ON SCHEMA schema_name
TO role_name;
要允许用户在他们不拥有的schema中创建对象,我们需要向他们授予CREATE
schema 权限:
GRANT CREATE ON SCHEMA schema_name
TO user_name;
🐣 请注意,默认情况下,在
public
schema 每个用户都有CREATE
和USAGE
。
🐔PostgreSQL schema 操作
-
要创建新schema,请使用
CREATE SCHEMA
声明。 -
要重命名schema或更改其所有者,请使用
ALTER SCHEMA
声明。 -
要删除schema,请使用
DELETE SCHEMA
声明。
在这之前,我们已经了解了PostgreSQL schema以及PostgreSQL如何使用搜索路径来解析对象名称。
🐔PostgreSQL CREATE SCHEMA
语句概述
🐣 NOTE: 在此处,我们将学习如何使用PostgreSQL
CREATE SCHEMA
语句以在数据库中创建新schema。
CREATE SCHEMA
语句允许我们在当前数据库中创建新schema。
创建SCHEMA
声明:
CREATE SCHEMA [IF NOT EXISTS] schema_name;
在以下语法中:
-
首先,指定架构后
CREATE SCHEMA
关键词。schema名称在当前数据库中必须是唯一的。 -
第二,可选使用
IF NOT EXISTS
只有当新schema不存在时才有条件地创建它。尝试创建已经存在的新schema而不使用IF NOT EXISTS
语句将导致错误。
🐣 NOTE:执行
CREATE SCHEMA
语句,我们必须具有当前数据库中CREATE
的权限。
我们还可以为用户创建schema:
CREATE SCHEMA [IF NOT EXISTS]
AUTHORIZATION username;
在这种情况下,将为username
创建schema
PostgreSQL还允许我们创建schema和对象列表,例如使用单个语句创建表和视图,如下所示:
CREATE SCHEMA schema_name
CREATE TABLE table_name1 (...)
CREATE TABLE table_name2 (...)
CREATE VIEW view_name1
SELECT select_list FROM table_name1;
🐣 NOTE:请注意,每个子命令不以分号 (;) 结尾。
🐔PostgreSQL CREATE SCHEMA
示例
让我们举一些使用CREATE SCHEMA
例子,以获得更好的理解。
🐓1) 使用CREATE SCHEMA
创建新SCHEMA示例
以下语句使用创建SCHEMA
语句以创建名为的新schema tests
:
CREATE SCHEMA tests;
以下语句返回当前数据库中的所有schema:
SELECT *
FROM pg_catalog.pg_namespace
ORDER BY nspname;)
🐓2) 使用CREATE SCHEMA
为用户创建schema
首先,创建一个角色 名为 gg
CREATE ROLE gg
LOGIN
PASSWORD 'Postgr@123#';
第二,为gg
创建schema语法如下 :
CREATE SCHEMA AUTHORIZATION gg;
第三,为gg
创建一个名为dd的 schema :
CREATE SCHEMA IF NOT EXISTS dd AUTHORIZATION john;
🐓3) 使用CREATE SCHEMA
创建schema及其对象的示例
以下示例使用CREATE SCHEMA
语句以创建名为的新schemassm
。它还会创建一个名为spring
的表和一个名为spring_boot
的视图
CREATE SCHEMA ssm
CREATE TABLE spring(
id SERIAL NOT NULL,
version DATE NOT NULL
)
CREATE VIEW spring_boot AS
SELECT ID, version
FROM spring
WHERE version <= 2.2.0;
🐣 NOTE: 在上面的文章中,我们已经学习了如何使用PostgreSQL
CREATE SCHEMA
语句以在数据库中创建新schema。
🐔PostgreSQL ALTER SCHEMA
语句概述
ALTER SCHEMA
语句允许我们更改schema的定义。例如,我们可以按如下方式重命名schema:
ALTER SCHEMA schema_name
RENAME TO new_name;
🐣 NOTE:
- 首先,在
ALTER SCHEMA
关键词后指定旧的schema_name。- 第二,在
RENAME
关键词后指定新的new_name。
请注意,要执行此语句,我们必须是schema的所有者,并且必须具有CREATE
数据库特权。
除了重命名schema之外,ALTER SCHEMA
还允许我们将schema的所有者更改为新的所有者,如以下语句所示:
ALTER SCHEMA schema_name
OWNER TO { new_owner | CURRENT_USER | SESSION_USER};
🐣 NOTE:
-
首先,
ALTER SCHEMA
指定要在其中更改所有者的schema的名称。 -
第二,
OWNER TO
指定新所有者.
🐔PostgreSQL ALTER SCHEMA
语句示例
让我们举一些使用ALTER SCHEMA
的示例,以获得更好的理解。
请注意,以下部分中的示例基于我们在CREATE SCHEMA
中的操作。
🐓1) 使用ALTER SCHEMA
重命名schema的示例
此示例使用ALTER SCHEMA
重命名dd
schema到pp
schema的语句:
ALTER SCHEMA dd
RENAME TO pp;
同样,以下示例重命名tests
schema:
ALTER SCHEMA tests
RENAME TO test;
🐓2) 使用ALTER SCHEMA
语句以更改schema的所有者
以下示例使用ALTER SCHEMA
将schema dd的所有者更改为postgres的语句;
ALTER SCHEMA dd
OWNER TO postgres;
以下是查询用户创建的schema的语句:
SELECT *
FROM
pg_catalog.pg_namespace
WHERE
nspacl is NULL AND
nspname NOT LIKE 'pg_%'
ORDER BY
nspname;
从输出中可以清楚地看到,dd
schema现在由id为10的所有者拥有,即postgres
。
同样,此语句将test的所有者更改为postgres
:
ALTER SCHEMA test
OWNER TO postgres;
🐣 在上面的文章中,我们学习了如何使用PostgreSQL
更改模式
语句以重命名schema或将schema的所有者更改为新的schema。
🐔PostgreSQL DROP SCHEMA
语句概述
DROP SCHEMA
移除一个SCHEMA以及数据库中的所有对象。
以下是的DROP SCHEMA
语法:
DROP SCHEMA [IF EXISTS] schema_name
[ CASCADE | RESTRICT ];
🐣释义:
- 首先,
DROP SCHEMA
关键字后指定架构要从中删除的schema_name.- 第二,使用
IF EXISTS
仅在schema存在时才有条件删除schema的选项。- 第三,使用
CASCADE
(级联)删除schema及其所有对象,进而删除依赖于这些对象的所有对象。如果仅在schema为空时才删除schema,则可以使用RESTRICT
选项。默认情况下,DROP SCHEMA
使用RESTRICT
选项。
执行DROP SCHEMA
语句,我们必须是要删除的schema的所有者或超级用户。
PostgreSQL允许你在一个DROP SCHEMA
声明中删除多个schema:
DROP SCHEMA [IF EXISTS] schema_name1 [,schema_name2,...]
[CASCADE | RESTRICT];
🐔PostgreSQL DROP SCHEMA
语句示例
🐓1) 使用DROP SCHEMA
删除空schema的语句示例
此示例使用DROP SCHEMA
删除gg的语句:
DROP SCHEMA IF EXISTS gg;
要刷新列表中的schema,请右键单击schema节点,然后选择 “刷新” 菜单项:
🐓2) 使用DROP SCHEMA
删除多个schema的语句示例
以下示例使用DROP SCHEMA
删除多个schema的语句gg
和test
使用单个语句:
DROP SCHEMA IF EXISTS gg, test;
🐓3) 使用DROP SCHEMA
删除非空schema示例的语句
此声明删除ssm
schema:
DROP SCHEMA ssm;
以下是控制台输出:
ERROR: cannot drop schema scm because other objects depend on it
DETAIL: table scm.deliveries depends on schema scm
view scm.delivery_due_list depends on schema scm
HINT: Use DROP ... CASCADE to drop the dependent objects too.
SQL state: 2BP01
因此,如果schema不为空,并且我们想要删除schema及其对象,则必须使用级联删除(CASCADE
):
DROP SCHEMA scm CASCADE;
同样,使用以下语句我们可以删除pp
的schema及其对象:
DROP SCHEMA pp CASCADE;
🐣在本文中,我们已经学习了如何使用PostgreSQL 'DROP SCHEMA' 语句在数据库中删除一个或多个schema。
未完待续..既然看到这里了,不妨来个大大的点赞吧![[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🍭(二)](https://static.blogweb.cn/article/4a0859e6901f438ab3d70de0c5a75369.webp)
转载自:https://juejin.cn/post/7156769468666871821