1.数据库逻辑结构介绍
2.数据库基本操作
2.1 创建数据库
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace ]
[ CONNECTION LIMIT [=] connlimit ] ]
参数说明如下。
·OWNER [=] user_name:用于指定新建的数据库属于哪个用 户,如果不指定,新建的数据库就属于当前执行命令的用户。
·TEMPLATE [=] template:模板名(从哪个模板创建新数据 库),如果不指定,将使用默认模板数据库(template1)。
·[ENCODING [=] encoding]:创建新数据库使用的字符编码。
·TABLESPACE [=] tablespace:用于指定和新数据库关联的表空 间名称。
·CONNECTION LIMIT [=] connlimit]:用于指定数据库可以接受 多少并发的连接。默认值为“-1”,表示没有限制。
postgres=#
postgres=# CREATE DATABASE osdbadb;
CREATE DATABASE
postgres=#
postgres=# CREATE DATABASE testdb01 ENCODING 'UTF-8' TEMPLATE template0;
CREATE DATABASE
postgres=#
2.2 修改数据库
ALTER DATABASE name [ [ WITH ] option [ ... ] ]
这里的“option”可以以下几种语法结构:
·CONNECTION LIMIT connlimit。
·ALTER DATABASE name RENAME TO new_name。
·ALTER DATABASE name OWNER TO new_owner。
·ALTER DATABASE name SET TABLESPACE new_tablespace。
·ALTER DATABASE name SET configuration_parameter {TO |=}
{value|DEFAULT}。
·ALTER DATABASE name SET configuration_parameter FROM
CURRENT。
·ALTER DATABASE name RESET configuration_parameter。
·ALTER DATABASE name RESET ALL。
示例1,将数据库“testdb01”的最大连接数修改为“10”,命令 如下:
示例2,将数据库“testdb01”的名称改为“mydb01”,命令 如下:
示例3,改变数据库“testdb01”的配置参数,使用户一旦连接到 这个用户,某个配置参数就设置为指定的值。比如,关闭在数据库 “testdb01”上的默认索引扫描,命令如下:
postgres=#
postgres=#
postgres=# alter database testdb01 CONNECTION LIMIT 10;
ALTER DATABASE
postgres=#
postgres=#
postgres=#
postgres=#
postgres=# alter database testdb01 rename to mydb01;
ALTER DATABASE
postgres=#
postgres=#
postgres=#
postgres=#
postgres=#
postgres=# ALTER DATABASE mydb01 SET enable_indexscan TO off;
ALTER DATABASE
postgres=#
2.3 删除数据库
postgres=#
postgres=# drop database testdb01;
ERROR: database "testdb01" does not exist
postgres=#
postgres=# drop database if exists mydb01;
DROP DATABASE
postgres=#
注意,如果还有用户连接在这个数据库上,将无法删除该数据 库。
2.4 常见问题
3. 模式
模式是数据库领域的一个基本概念,有些数据库把模式和用户合 二为一了,而PostgreSQL是有清晰的模式定义。
3.1 什么是模式
模式(Schema)是数据库中的一个概念,可以将其理解为一个命 名空间或目录,不同的模式下可以有相同名称的表、函数等对象而不 会产生冲突。提出模式的概念是为了便于管理,只要有权限,各个模 式的对象可以互相调用。
·允许多个用户使用同一个数据库且用户之间又不会互相干扰。
·把数据库对象放在不同的模式下组织成逻辑组,使数据库对象 更便于管理。
·第三方的应用可以放在不同的模式中,这样就不会和其他对象 的名字产生冲突了。
3.2 模式的使用
postgres=# create schema maxdba;
CREATE SCHEMA
postgres=# \dn
List of schemas
Name | Owner
--------+----------
maxdba | postgres
public | postgres
(2 rows)
postgres=# drop schema maxdba;
DROP SCHEMA
postgres=#
postgres=# create schema authorization postgres;
CREATE SCHEMA
postgres=#
postgres=# \dn
List of schemas
Name | Owner
----------+----------
postgres | postgres
public | postgres
(2 rows)
postgres=#
在模式中可以修改名称和属主,
语法格式如下:
ALTER SCHEMA name RENAME TO newname
ALTER SCHEMA name OWNER TO newowner
postgres=#
postgres=# create schema postgres
postgres-# CREATE TABLE t1 (id int, title text)
postgres-# CREATE TABLE t2 (id int, content text)
postgres-# CREATE VIEW v1 AS SELECT a.id,a.title, b.content FROM t1 a,t2 b where a.id=b.id;
CREATE SCHEMA
postgres=# \d
List of relations
Schema | Name | Type | Owner
----------+-------------+-------+----------
postgres | t1 | table | postgres
postgres | t2 | table | postgres
postgres | v1 | view | postgres
public | class | table | postgres
public | ipdb1 | table | postgres
public | ipdb2 | table | postgres
public | jtest01 | table | postgres
public | jtest02 | table | postgres
public | jtest03 | table | postgres
public | score | table | postgres
public | student | table | postgres
public | student_bak | table | postgres
public | t | table | postgres
public | test02 | table | postgres
public | test1 | table | postgres
public | testtab05 | table | postgres
public | testtab06 | table | postgres
public | testtab07 | table | postgres
public | testtab08 | table | postgres
public | testtab09 | table | postgres
(20 rows)
postgres=# alter schema postgres rename to postgresold;
ALTER SCHEMA
postgres=# \dn
List of schemas
Name | Owner
-------------+----------
maxdba | postgres
osdba | postgres
postgresold | postgres
public | postgres
(4 rows)
postgres=#
‘
搜索路径中的第一个模式叫当前模式。除了是搜索的第一个模式 之外,它还是在CREATE TABLE没有声明模式名时新建表所属的模式。 要显示当前搜索路径,使用下面的命令:
postgres=#
postgres=# show search_path;
search_path
-----------------
"$user", public
(1 row)
postgres=#
3.3 模式的搜索路径
postgres=#
postgres=#
postgres=# show search_path;
search_path
-----------------
"$user", public
(1 row)
postgres=#
4.表
4.1 创建表
postgres=# create table test01(id int primary key, note
postgres(# varchar(20));
CREATE TABLE
postgres=# create table test02(id1 int, id2 int, note
postgres(# varchar(20), CONSTRAINT pk_test02 primary key(id1,id2));
ERROR: relation "test02" already exists
postgres=# drop table test02;
DROP TABLE
postgres=# create table test02(id1 int, id2 int, note
postgres(# varchar(20), CONSTRAINT pk_test02 primary key(id1,id2));
CREATE TABLE
postgres=# drop test03;
ERROR: syntax error at or near "test03"
LINE 1: drop test03;
^
postgres=# drop table test03;
ERROR: table "test03" does not exist
postgres=# create table test03(id1 int, id2 int, id3 int,
postgres(# note varchar(20), CONSTRAINT pk_test03 primary
postgres(# key(id1,id2), CONSTRAINT uk_test03_id3 UNIQUE(id3));
CREATE TABLE
postgres=#
postgres=# CREATE TABLE child(name varchar(20), age int,
postgres(# note text, CONSTRAINT ck_child_age CHECK(age <18));
CREATE TABLE
postgres=# CREATE TABLE baby (LIKE child);
CREATE TABLE
postgres=# \d child;
Table "public.child"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
name | character varying(20) | | |
age | integer | | |
note | text | | |
Check constraints:
"ck_child_age" CHECK (age < 18)
postgres=# \d baby
Table "public.baby"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
name | character varying(20) | | |
age | integer | | |
note | text | | |
postgres=# CREATE TABLE baby2 (LIKE child INCLUDING
postgres(# ALL);
CREATE TABLE
postgres=# \d baby2
Table "public.baby2"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
name | character varying(20) | | |
age | integer | | |
note | text | | |
Check constraints:
"ck_child_age" CHECK (age < 18)
postgres=# CREATE TABLE baby2 AS SELECT * FROM child WITH
postgres-# NO DATA;
ERROR: relation "baby2" already exists
postgres=# CREATE TABLE baby3 AS SELECT * FROM child WITH
NO DATA;
CREATE TABLE AS
postgres=#
4.2 约束
·检查约束。
postgres=# CREATE TABLE persons (
postgres(# name varchar(40),
postgres(# age int CONSTRAINT check_age CHECK (age >= 0 and age
postgres(# <=150),
postgres(# sex boolean
postgres(# );
CREATE TABLE
postgres=# CREATE TABLE books (
postgres(# book_no integer,
postgres(# name text,
postgres(# price numeric CHECK (price > 0),
postgres(# discounted_price numeric CHECK (discounted_price > 0),
postgres(# CHECK (price > discounted_price)
postgres(# );
CREATE TABLE
postgres=#
·非空约束。
非空约束只是简单地声明一个字段必须不能是NULL。
postgres=#
postgres=# CREATE TABLE books1 (
postgres(# book_no integer not null,
postgres(# name text,
postgres(# price numeric
postgres(# );
CREATE TABLE
postgres=# CREATE TABLE books2 (
postgres(# book_no integer NOT NULL,
postgres(# name text,
postgres(# price numeric NOT NULL CHECK (price >0)
postgres(# );
CREATE TABLE
postgres=#
·唯一约束。
唯一约束可以保证在一个字段或者一组字段中的数据相较于表中 其他行的数据是唯一的。
postgres=#
postgres=# CREATE TABLE books3 (
postgres(# book_no integer UNIQUE,
postgres(# name text,
postgres(# price numeric
postgres(# );
CREATE TABLE
postgres=#
postgres=#
postgres=#
postgres=#
postgres=#
postgres=# CREATE TABLE books4 (
postgres(# book_no integer,
postgres(# name text,
postgres(# price numeric,
postgres(# UNIQUE(book_no)
postgres(# );
CREATE TABLE
postgres=#
·主键。
主键与唯一约束的区别是,主键不能为空。通常我们是建表时就 指定了主键:
postgres=#
postgres=# CREATE TABLE books5 (
postgres(# book_no integer primary key,
postgres(# name text,
postgres(# price numeric,
postgres(# UNIQUE(book_no)
postgres(# );
CREATE TABLE
postgres=# ALTER TABLE books add constraint pk_books_book_no primary
postgres-# key (book_no);
ALTER TABLE
postgres=#
·外键约束。
外键约束是对表之间关系的一种约束,用于约束本表中一个或多 个字段的数值必须出现在另一个表的一个或多个字段中。这种约束也 可以称为两个相关表之间的参照完整性约束。
postgres=#
postgres=# CREATE TABLE class(
postgres(# class_no int primary key,
postgres(# class_name varchar(40)
postgres(# );
CREATE TABLE
postgres=# CREATE TABLE student(
postgres(# student_no int primary key,
postgres(# student_name varchar(40),
postgres(# age int,
postgres(# class_no int REFERENCES class(class_no)
postgres(# );
CREATE TABLE
postgres=# select * from class;
class_no | class_name
----------+------------
(0 rows)
postgres=# insert into student values(1,'张三',13,10);
ERROR: insert or update on table "student" violates foreign key constraint "student_class_no_fkey"
DETAIL: Key (class_no)=(10) is not present in table "class".
postgres=#
4.3 修改表
·增加字段。
·删除字段。
·增加约束。
·删除约束。
·修改默认值。
·删除默认值。
·修改字段数据类型。
·重命名字段。
·重命名表。