of {$slidecount} ½ {$title} ATZJG.NET {$author}

首页






创建数据库
数据库原理及应用实验


Haifeng Xu


(hfxu@yzu.edu.cn)

目录

数据库的创建和删除

数据库的创建和删除

最基本的创建数据库的 SQL 语句是

CREATE DATABASE db_name;
mydb=> CREATE DATABASE sakila;
CREATE DATABASE
mydb=> \l
                                                    数据库列表
   名称    |  拥有者  | 字元编码 | Locale Provider | 校对规则 | Ctype | Locale | ICU Rules |       存取权限
-----------+----------+----------+-----------------+----------+-------+--------+-----------+-----------------------
 mydb      | haife    | UTF8     | libc            | zh-CN    | zh-CN |        |           |
 postgres  | postgres | UTF8     | libc            | zh-CN    | zh-CN |        |           |
 sakila    | haife    | UTF8     | libc            | zh-CN    | zh-CN |        |           |
 template0 | postgres | UTF8     | libc            | zh-CN    | zh-CN |        |           | =c/postgres          +
           |          |          |                 |          |       |        |           | postgres=CTc/postgres
 template1 | postgres | UTF8     | libc            | zh-CN    | zh-CN |        |           | =c/postgres          +
           |          |          |                 |          |       |        |           | postgres=CTc/postgres
(5 行记录)

删除数据库的 SQL 语句是

DROP DATABASE db_name;

注意无法删除当前使用的数据库.

mydb=> \connect sakila
您现在已经连接到数据库 "sakila",用户 "haife".
sakila=> drop database sakila;
错误:  无法删除当前使用的数据库
sakila=> \c mydb
您现在已经连接到数据库 "mydb",用户 "haife".
mydb=> drop database sakila;
DROP DATABASE
mydb=>

模板数据库

模板数据库

PostgreSQL 安装好以后默认附带两个模板数据库: template0template1. 之前测试过, 可以连接 template1, 但不能连接 template0. 如果创建数据库时未指定使用哪个模板, 则系统默认使用 template1 作为新库的模板.

注意事项

切记, 任何时候都不要对 template0 模板数据库做任何修改, 因为这是原始的干净模板, 如果其他模板数据库被搞坏了, 基于这个数据库做一个副本就可以了.

如果希望定制自己的模板数据库, 则请基于 template1 进行修改, 或者自己另外创建一个模板数据库再修改.

对基于 template1 或你自建的模板数据库创建出来的数据库来说, 你不能修改其字符编码和排序规则. 如果你希望修改其字符编码和排序规则, 则请基于 template0 模板创建新数据库.

例子

基于某个模板来创建新数据库的基本语法是

CREATE DATABASE my_db TEMPLATE my_template_db;

你可以使用任何一个现存的数据库作为创建新数据库时的模板. 例如: 已经存在数据库 mydb, 尽管 mydb 不是数据库模板, 但仍可以作为被参照数据库用于数据库的创建.

postgres=# CREATE DATABASE new_db TEMPLATE mydb;
CREATE DATABASE

此外, 你还可以将某个现存的数据库标记为模板数据库, 对于这种被标记为模板的数据库, PostgreSQL 会禁止对其进行编辑或删除.

任何一个具备 CREATEDB 权限的角色都可以使用这种模板数据库.

postgres=# CREATE DATABASE sakila;
CREATE DATABASE

以超级用户身份运行以下 SQL 可使任何数据库成为模板数据库.

UPDATE pg_database SET datistemplate = TRUE WHERE datname='mydb';
postgres=# UPDATE pg_database SET datistemplate=true WHERE datname='sakila';
UPDATE 1

此时无法删除模板数据库, 即使超级用户也不被允许.

postgres=# drop database sakila;
错误:  无法删除模板数据库

若要修改或删除此模板数据库, 则将 pg_database 中的 datistemplate 属性置为 FALSE 即可. 此时 PostgreSQL 将该数据库的编辑限制解除.

postgres=# UPDATE pg_database SET datistemplate=false WHERE datname='sakila';
UPDATE 1
postgres=# drop database sakila;
DROP DATABASE
postgres=#

schema 的使用

使用 schema 管理数据库

schema 可以对数据库中的对象进行逻辑分组管理. schema 可以翻译为架构模式. 可以理解为名称空间.

例子

假设要为一家航空公司设计 IT 系统, 有飞机信息表、日常维护记录表、机组人员信息表、人事信息表、乘客信息表, 则可以建立三个 schema,

另外一种常见的管理 schema 的方法是基于角色的管理. 当系统拥有多个客户端并且每个客户端的数据必须完全隔离时, 这种方法特别合适.

宠物狗信息管理系统

假设你的工作是开发一套“宠物狗信息管理系统”并将该在线系统租赁给宠物狗 SPA 店使用.

通过广告, 现在你有了一些客户, 但该系统的数据库中目前仅用了一张 dogs 表来存储所有宠物狗的信息.

你的系统必须遵守客户间数据的完全隔离性, 即必须保证一家 SPA 店看不到另一家 SPA 店的宠物狗信息.

为了达到这个要求, 你可以为每家客户都建立一个单独的 schema, 每个 schema 中建立相同的一张 dogs 表. 然后就可以把这些宠物狗的数据从单一的dogs 分散到不同的shema的 dogs 表中.

最后为每个 schema 创建一个与之同名的可登录角色, 这样就可以实现各自独立管理.

查看模式的名称

命令 \dn 用于查看当前数据库中所有模式的名称.

postgres=# \dn
        架构模式列表
  名称  |      拥有者
--------+-------------------
 public | pg_database_owner
(1 行记录)

也可以在 information_schema 模式下的 schemata 视图中查询.

SELECT schema_name FROM information_schema.schemata;
postgres=# SELECT schema_name FROM information_schema.schemata;
    schema_name
--------------------
 public
 information_schema
 pg_catalog
 pg_toast
(4 行记录)

查看一下视图 information_schema.schemata 的结构.

postgres=# \d information_schema.schemata
                              视图 "information_schema.schemata"
             栏位              |               类型                | 校对规则 | 可空的 | 预设
-------------------------------+-----------------------------------+----------+--------+------
 catalog_name                  | information_schema.sql_identifier |          |        |
 schema_name                   | information_schema.sql_identifier |          |        |
 schema_owner                  | information_schema.sql_identifier |          |        |
 default_character_set_catalog | information_schema.sql_identifier |          |        |
 default_character_set_schema  | information_schema.sql_identifier |          |        |
 default_character_set_name    | information_schema.sql_identifier |          |        |
 sql_path                      | information_schema.character_data |          |        |

pg_catalog.pg_namespace 中存放了数据库中所有模式的信息.

postgres=# \d pg_catalog.pg_namespace
         数据表 "pg_catalog.pg_namespace"
   栏位   |   类型    | 校对规则 |  可空的  | 预设
----------+-----------+----------+----------+------
 oid      | oid       |          | not null |
 nspname  | name      |          | not null |
 nspowner | oid       |          | not null |
 nspacl   | aclitem[] |          |          |
索引:
    "pg_namespace_oid_index" PRIMARY KEY, btree (oid)
    "pg_namespace_nspname_index" UNIQUE CONSTRAINT, btree (nspname)
postgres=# SELECT nspname FROM pg_catalog.pg_namespace;
      nspname
--------------------
 pg_toast
 pg_catalog
 public
 information_schema
(4 行记录)

环境变量

常用的系统变量

常用的系统变量有 PGHOST, PGPORT, PGUSER , PGDATABASE, PGPASSWORD, PSQL_HISTORY 等等.

PGHOST=175.27.168.87 PGPORT=5432 PGUSER=

扩展包的系统变量

PostGIS 插件安装好后, 会自动建立几个系统变量, 例如:






End






Thanks very much!