创建数据库
CREATE DATABASE name
[ [ WITH ]
[ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace_name ]
[ CONNECTION LIMIT [=] connlimit ] ]
参数
name
要创建的数据库名字。最好用双引号包起来,以区分大小写。
user_name
数据库用户的名字,他将是新数据库的所有者,或者是使用DEFAULT
选项来指定当前缺省用户(也就是执行命令的用户)。 要创建一个其他角色所有的数据库,你必须是那个角色的直接或间接的成员,或者是超级用户。
template
模板名,即从哪个模板创建新数据库,或者使用DEFAULT
选项来指定缺省模板(template1
)。
encoding
创建新数据库使用的字符编码。 可以使用文本名字(例如‘SQL_ASCII‘
)、整数编号或是DEFAULT
选项来指定(模版数据库的编码)。
lc_collate
用于新数据库的排序规则(LC_COLLATE)。 这影响到应用对字符串的排序顺序,例如:在有ORDER BY的查询中,以及用于文本列的索引的顺序。 在默认情况下,使用模板数据库的排序规则。 请看以下附加的限制。
lc_ctype
用于新数据库的字符分类(LC_CTYPE
)。 这影响字符的分类,例如: 小写、大写和数字。 默认情况下使用模板数据库的字符分类。 请看以下附加的限制。
tablespace_name
和新数据库关联的表空间名字, 或者使用DEFAULT
选项表示使用模版数据库的表空间。 这个表空间将成为在这个数据库里创建的对象的缺省表空间。
connlimit
数据库可以接受多少并发的连接。-1(缺省)意味着没有限制。
可选参数可以按任意顺序书写,而不仅仅是上面显示的顺序。
实例
CREATE DATABASE "myDb"
WITH
OWNER = postgres
ENCODING = 'UTF8'
CONNECTION LIMIT = -1;
psql中不支持多行,所以将上述SQL保存至一个sql文件中,在psql中执行\i FQ.sql
即可执行多行的SQL如下:
postgres=# \i FQ.sql
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
myDb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
事项
如果你看到类似下面这样的信息:
createdb: command not found
那么就是PostgreSQL没有安装好:要么是就根本没装上、要么是搜索路径没有包含它。 尝试用绝对路径调用该命令试试:
$ /usr/local/pgsql/bin/createdb mydb
在你的节点上这个路径可能不一样。请和管理员联系或者看看安装指导以获取正确的位置。
另外一种响应可能是这样:
createdb: could not connect to database postgres: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
这意味着服务器没有启动,或者没有在createdb
预期的地方启动。同样, 你也要检查安装指导或者找管理员。
另外一个响应可能是这样:
createdb: could not connect to database postgres: FATAL: role "joe" does not exist
在这里提到了你自己的登陆名。如果管理员没有为你创建PostgreSQL 用户帐号,就会发生这些现像。
如果你有个数据库用户帐号,但是没有创建数据库所需要的权限,那么你会看到下面的东西:
createdb: database creation failed: ERROR: permission denied to create database
并非所有用户都经过了创建新数据库的授权。如果PostgreSQL 拒绝为你创建数据库,那么你需要让站点管理员赋予你创建数据库的权限。出现这种情况时 请咨询你的站点管理员。如果你自己安装了PostgreSQL,那么你应该以你启动数据库服务器的用户身份登陆然后参考手册完成权限的赋予工作。
你还可以用其它名字创建数据库。PostgreSQL允许你在 一个节点上创建任意数量的数据库。数据库名必须是以字母开头并且小于 63 个字节 长。一个方便的做法是创建和你当前用户名同名的数据库。许多工具假设它为缺省的 数据库名,所以这样可以节省敲键。要创建这样的数据库,只需要键入:
$ createdb
切换数据库
- 在psql使用
\l
列出数据库,使用\c
切换数据库
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
myDb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres-# \c "myDb"
Password for user postgres:
You are now connected to database "myDb" as user "postgres".
myDb-#
- 也可以在使用
psql
命令时使用参数-d
指定数据库名字
[PostgresFile] psql -U postgres -W -d "myDb"
Password for user postgres:
psql (9.5.11
Type "help" for help
myDb=#
删除数据库
DROP DATABASE [ IF EXISTS ] name
DROP DATABASE
删除一个数据库。删除一个现存数据库的目录入口并且删除包含数据的目录。 只有数据库所有者能够执行这条命令。还有,如果你或者任何其他人正在与目标数据库连接, 那么就不能执行这条命令。所以要与postgres
或者任何其它数据库连接,再发出这条命令。DROP DATABASE
不能撤销,小心使用!
参数
IF EXISTS
如果指定的数据库不存在,那么发出一个 notice 而不是抛出一个错误。
myDb=# DROP DATABASE IF EXISTS "myDb";
ERROR: cannot drop the currently open database
myDb=# \c postgres
Password for user postgres:
You are now connected to database "postgres" as user "postgres".
postgres=# DROP DATABASE IF EXISTS "myDb";
DROP DATABASE
postgres=#
可以看到当前数据库为myDb
时是不能进行删除操作的。