暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgresql逻辑结构之默认数据库(二)

原创 江湖小虾米 2024-01-21
589

在安装完pg,初始化完成后,默认会创建三个数据库,template0、template1、postgres。

  • template0 模板数据库,用于从逻辑备份中恢复或创建不同编码的数据库,任何时候都不应该修改此数据库内容。
  • template1 用户模板数据库,用户创建的数据库继承自此数据库。如果想让自建的数据库默认有某个对象,可以在此数据库中创建对象,自建数据库就会继承创建的对象。
  • postgres 默认的管理数据库,数据字典存放于此数据库中。
mydb=# \l+ List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description -----------+----------+----------+-------------+-------------+-----------------------+---------+------------+-------------------------------------------- mydb | myq | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 8745 kB | pg_default | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 8561 kB | pg_default | default administrative connection database template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +| 8385 kB | pg_default | unmodifiable empty database | | | | | postgres=CTc/postgres | | | template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +| 8385 kB | pg_default | default template for new databases | | | | | postgres=CTc/postgres | | | (4 rows)

在创建数据库时可以指定使用哪个数据库模板,也可以指定当前创建的数据库是否可以作为模板。

创建一个数据库db1,以template1作为模板,并设置此数据库可以做为其它数据的模板。

mydb=# create database db1 template template1 IS_TEMPLATE true; CREATE DATABASE #在db1中创建一个表t,并插入一行数据。 mydb=# \c db1 You are now connected to database "db1" as user "myq". db1=# create table t(name varchar(10)); CREATE TABLE db1=# insert into t values('alice'); INSERT 0 1 db1=# select * from t; name ------- alice (1 row)

创建数据库db2,以db1为模板

db1=# create database db2 template db1; CREATE DATABASE db1=# \c db2 You are now connected to database "db2" as user "myq". db2=# \dt+ List of relations Schema | Name | Type | Owner | Persistence | Access method | Size | Description --------+------+-------+-------+-------------+---------------+------------+------------- public | t | table | myq | permanent | heap | 8192 bytes | (1 row) db2=# select * from t; name ------- alice (1 row)

db2继承了db1中的对象表t。继承并非链接,而是完整的拷贝。可以删除db1中的表t,看下db2中的表t还是否存在。

db2=# \c db1 You are now connected to database "db1" as user "myq". db1=# drop table t; DROP TABLE db1=# \c db2 You are now connected to database "db2" as user "myq". db2=# \dt+ List of relations Schema | Name | Type | Owner | Persistence | Access method | Size | Description --------+------+-------+-------+-------------+---------------+------------+------------- public | t | table | myq | permanent | heap | 8192 bytes | (1 row) db2=# select * from t; name ------- alice (1 row)

可以看到db1中的t表删除了db2中的t表任然存在,说明两个t表不存在关联。

模板数据库删除
模板数据库没办法直接删除,删除会报错,要删除先要取消数据库的模板属性

mydb=# drop database db1; ERROR: cannot drop a template database mydb=# alter database db1 is_template false; ALTER DATABASE mydb=# drop database db1; DROP DATABASE
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论