http://www.linuxidc.com/Linux/2013-10/92111.htm
http://www.jb51.net/article/65335.htm
Ubuntu PostgreSQL安装和配置
一、安装
1、安装
使用如下命令,会自动安装最新版,这里为9.5
sudo apt-get install postgresql
安装完成后,默认会:
(1)创建名为"postgres"的Linux用户
(2)创建名为"postgres"、不带密码的默认数据库账号作为数据库管理员
(3)创建名为"postgres"的表
安装完成后的一些默认信息如下:
config /etc/postgresql/9.5/main
data /var/lib/postgresql/9.5/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5432
2、psql命令
安装完后会有PostgreSQL的客户端psql,通过 sudo -u postgres psql 进入,提示符变成: postgres=#
在这里可用执行SQL语句和psql的基本命令。可用的基本命令如下:
\password:设置密码
\q:退出
\h:查看SQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:连接其他数据库。
\d:列出当前数据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。
\e:打开文本编辑器。
\conninfo:列出当前数据库和连接的信息。
二、修改数据库默认账号的密码
1、登录
使用psql命令登录数据库的命令为:
psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432
上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。
输入上面命令以后,系统会提示输入dbuser用户的密码。
psql命令存在简写形式:
如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)
如果PostgreSQL内部还存在与当前系统用户同名的数据库,则数据库名也可以省略。
2、修改数默认管账号的密码
以Linux用户"postgres"的身份(此时只有该用户有psql命令)执行psql客户端,进入该客户端的提示符界面(这里系统用户名、数据库用户名、数据库名都为postgres,故可采用简写形式)
postgres=# alter user postgres with password '123456';
这样,管理员"postgres"的密码就为"123456"。
退出psql客户端命令:\q
若要删除该管理员的密码,则可用命令:sudo -u postgres psql -d postgres
三、修改Linux用户的密码
这个其实与安装postgresql关系不大。
以Linux用户"postgres"为例,对其运行passwd命令:
zsm@ubuntu:/etc/postgresql/9.5/main$ sudo -u postgres passwd //也可以 sudo passwd postgres
Changing password for postgres.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
四、配置数据库以允许远程连接访问
安装完成后,默认只能本地才能连接数据库,其他机子访问不了,需要进行配置。
1、修改监听地址
sudo gedit /etc/postgresql/9.5/main/postgresql.conf
将 #listen_addresses = 'localhost' 的注释去掉并改为 listen_addresses = '*'
2、修改可访问用户的IP段
sudo gedit /etc/postgresql/9.5/main/pg_hba.conf
在文件末尾添加: host all all 0.0.0.0 0.0.0.0 md5 ,表示运行任何IP连接
3、重启数据库
sudo /etc/init.d/postgresql restart
其他:管理用户、建立数据库等
五、添加新用户和新数据库
法一:使用PostgreSQL客户端psql
运行系统用户"postgres"的psql命令,进入客户端:
创建用户"xiaozhang"并设置密码:
postgres=# create user xiaozhang with password '123456';
创建数据库exampledb,所有者为xiaozhang:
postgres=# create database exampledb owner xiaozhang;
将exampledb数据库的所有权限赋予xiaozhang,否则xiaozhang只能登录psql,没有任何数据库操作权限:
grant all privileges on database exampledb to xiaozhang;
法二:使用shell命令行
安装PostgreSQL后提供了createuser和createdb命令行程序。
首先创建数据库用户"xiaozhang1",并指定为超级用户:
sudo -u postgres createuser --superuser xiaozhang1;
接着登录psql控制台设置其密码后退出:
zsm@ubuntu:~$ sudo -u postgres psql
psql (9.5.3)
Type "help" for help.
postgres=# \password xiaozhang1;
Enter new password:
Enter it again:
postgres=# \q
然后在shell命令行下创建数据库并指定所有者:
sudo -u postgres createdb -O xiaozhang1 exampledb1;
法三:使用paadmin3以管理员连接数据库后创建
经过法一、法二操作后,执行 postgres=# \du 得到用户列表如下:
执行 postgres=# \l 得到数据库列表如下:
若要删除用户(如删除xiaozhang)可先 postgres=# drop database example; 再 postgres=# drop user xiaozhang; 。
六、基本数据库操作命令
# 创建新表
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
# 插入数据
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');
# 选择记录
SELECT * FROM user_tbl;
# 更新数据
UPDATE user_tbl set name = '李四' WHERE name = '张三';
# 删除记录
DELETE FROM user_tbl WHERE name = '李四' ;
# 添加栏位
ALTER TABLE user_tbl ADD email VARCHAR(40);
# 更新结构
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
# 更名栏位
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
# 删除栏位
ALTER TABLE user_tbl DROP COLUMN email;
# 表格更名
ALTER TABLE user_tbl RENAME TO backup_tbl;
# 删除表格
DROP TABLE IF EXISTS backup_tbl;
sunzhifeng@ubu:~$ sudo -u postgres psql
psql (9.5.5)
Type "help" for help.
postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# alter user postgres with password 'tiger';
ALTER ROLE
postgres=# \q
sunzhifeng@ubu:~$ psql -u postgres
/usr/lib/postgresql/9.5/bin/psql: 不适用的选项 -- u
Try "psql --help" for more information.
sunzhifeng@ubu:~$ sudo -u postgre psql
sudo: 未知用户:postgre
sudo: 无法初始化策略插件
sunzhifeng@ubu:~$ sudo -u postgres psql
psql (9.5.5)
Type "help" for help.
postgres=# /q
postgres-# \q
sunzhifeng@ubu:~$ sudo -u postgres psql
psql (9.5.5)
Type "help" for help.
postgres=# create user sunzhifeng with password 'tiger';
CREATE ROLE
postgres=# create datebase exampledb owner sunzhifeng;
ERROR: syntax error at or near "datebase"
LINE 1: create datebase exampledb owner sunzhifeng;
^
postgres=# create database exampledb owner sunzhifeng;
CREATE DATABASE
postgres=# grant all privileges on database exampledb to sunzhifeng;
GRANT
postgres=# ]du
postgres-# \du
postgres-# \l
postgres-# \q
sunzhifeng@ubu:~$ psql -U sunzhifeng -d exampledb -h 127.0.0.1 -p 5432
Password for user sunzhifeng:
psql (9.5.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
exampledb=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+------------+----------+-------------+-------------+---------------------------
exampledb | sunzhifeng | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/sunzhifeng +
| | | | | sunzhifeng=CTc/sunzhifeng
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
exampledb=> \du
List of roles
Role name | Attributes | Member of
------------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
sunzhifeng | | {}
exampledb=> create table testuser(name varchar(20),signupdate date);
CREATE TABLE
exampledb=> show tables
exampledb-> \l
exampledb->
exampledb-> help
exampledb-> \d
List of relations
Schema | Name | Type | Owner
--------+----------+-------+------------
public | testuser | table | sunzhifeng
(1 row)
exampledb-> \d testuser
Table "public.testuser"
Column | Type | Modifiers
------------+-----------------------+-----------
name | character varying(20) |
signupdate | date |
exampledb-> \conninfo
You are connected to database "exampledb" as user "sunzhifeng" on host "127.0.0.1" at port "5432".
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
exampledb-> \?
exampledb->
exampledb-> \q
sunzhifeng@ubu:~$ psql -U sunzhifeng
psql: FATAL: database "sunzhifeng" does not exist
sunzhifeng@ubu:~$ psql -U sunzhifeng -d example
psql: FATAL: database "example" does not exist
sunzhifeng@ubu:~$ psql -U sunzhifeng -d example -h 127.0.0.1
Password for user sunzhifeng:
psql: FATAL: database "example" does not exist
sunzhifeng@ubu:~$ psql -U sunzhifeng -d example -h 127.0.0.1
Password for user sunzhifeng:
psql: FATAL: database "example" does not exist
sunzhifeng@ubu:~$ psql -U sunzhifeng -d example -h 127.0.0.1
Password for user sunzhifeng:
psql: FATAL: database "example" does not exist
sunzhifeng@ubu:~$ psql -U sunzhifeng -d example -h 127.0.0.1 -p5432
Password for user sunzhifeng:
psql: FATAL: database "example" does not exist
sunzhifeng@ubu:~$ psql -u sunzhifeng
/usr/lib/postgresql/9.5/bin/psql: 不适用的选项 -- u
Try "psql --help" for more information.
sunzhifeng@ubu:~$ psql -U sunzhifeng -d exampledb -h 127.0.0.1
Password for user sunzhifeng:
psql (9.5.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
exampledb=> \conninfo
You are connected to database "exampledb" as user "sunzhifeng" on host "127.0.0.1" at port "5432".
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
exampledb=> \d
List of relations
Schema | Name | Type | Owner
--------+----------+-------+------------
public | testuser | table | sunzhifeng
(1 row)
exampledb=> \d testuser
Table "public.testuser"
Column | Type | Modifiers
------------+-----------------------+-----------
name | character varying(20) |
signupdate | date |
exampledb=>
这篇文章主要介绍了PostgreSQL教程(一):数据表详解表的定义、系统字段、表的修改、表的权限等4大部份内容,内容种包括表的创建、删除、修改、字段的修改、删除、主键和外键、约束添加修改删除等,本文讲解了,需要的朋友可以参考下
一、表的定义:
对于任何一种关系型数据库而言,表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。
1. 创建表:
复制代码 代码如下:
CREATE TABLE products (
product_no integer,
name text,
price numeric
);
2. 删除表:
复制代码 代码如下:
DROP TABLE products;
3. 创建带有缺省值的表:
复制代码 代码如下:
CREATE TABLE products (
product_no integer,
name text,
price numeric DEFAULT 9.99 --DEFAULT是关键字,其后的数值9.99是字段price的默认值。
);
CREATE TABLE products (
product_no SERIAL, --SERIAL类型的字段表示该字段为自增字段,完全等同于Oracle中的Sequence。
name text,
price numeric DEFAULT 9.99
);
输出为:
复制代码 代码如下:
NOTICE: CREATE TABLE will create implicit sequence "products_product_no_seq" for serial column "products.product_no"
4. 约束:
检查约束是表中最为常见的约束类型,它允许你声明在某个字段里的数值必须满足一个布尔表达式。不仅如此,我们也可以声明表级别的检查约束。
复制代码 代码如下:
CREATE TABLE products (
product_no integer,
name text,
--price字段的值必须大于0,否则在插入或修改该字段值是,将引发违规错误。还需要说明的是,该检查约束
--是匿名约束,即在表定义时没有显示命名该约束,这样PostgreSQL将会根据当前的表名、字段名和约束类型,
--为该约束自动命名,如:products_price_check。
price numeric CHECK (price > 0)
);
CREATE TABLE products (
product_no integer,
name text,
--该字段的检查约束被显示命名为positive_price。这样做好处在于今后维护该约束时,可以根据该名进行直接操作。
price numeric CONSTRAINT positive_price CHECK (price > 0)
);
下面的约束是非空约束,即约束的字段不能插入空值,或者是将已有数据更新为空值。
复制代码 代码如下:
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric
);
如果一个字段中存在多个约束,在定义时可以不用考虑约束的声明顺序。
复制代码 代码如下:
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric NOT NULL CHECK (price > 0)
);
唯一性约束,即指定的字段不能插入重复值,或者是将某一记录的值更新为当前表中的已有值。
复制代码 代码如下:
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric
);
CREATE TABLE products (
product_no integer,
name text,
price numeric,
UNIQUE (product_no)
);
为表中的多个字段定义联合唯一性。
复制代码 代码如下:
CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c)
);
为唯一性约束命名。
复制代码 代码如下:
CREATE TABLE products (
product_no integer CONSTRAINT must_be_different UNIQUE,
name text,
price numeric
);
在插入数据时,空值(NULL)之间被视为不相等的数据,因此对于某一唯一性字段,可以多次插入空值。然而需要注意的是,这一规则并不是被所有数据库都遵守,因此在进行数据库移植时可能会造成一定的麻烦。
5. 主键和外键:
从技术上来讲,主键约束只是唯一约束和非空约束的组合。
复制代码 代码如下:
CREATE TABLE products (
product_no integer PRIMARY KEY, --字段product_no被定义为该表的唯一主键。
name text,
price numeric
);
和唯一性约束一样,主键可以同时作用于多个字段,形成联合主键:
复制代码 代码如下:
CREATE TABLE example (
a integer,
b integer,
c integer,
PRIMARY KEY (b, c)
);
外键约束声明一个字段(或者一组字段)的数值必须匹配另外一个表中某些行出现的数值。 我们把这个行为称做两个相关表之间的参考完整性。
复制代码 代码如下:
CREATE TABLE orders (
order_id integer PRIMARY KEY, --该表也可以有自己的主键。
--该表的product_no字段为上面products表主键(product_no)的外键。
product_no integer REFERENCES products(product_no),
quantity integer
);
CREATE TABLE t1 (
a integer PRIMARY KEY,
b integer,
c integer,
--该外键的字段数量和被引用表中主键的数量必须保持一致。
FOREIGN KEY (b, c) REFERENCES example (b, c)
);
当多个表之间存在了主外键的参考性约束关系时,如果想删除被应用表(主键表)中的某行记录,由于该行记录的主键字段值可能正在被其引用表(外键表)中某条记录所关联,所以删除操作将会失败。如果想完成此操作,一个显而易见的方法是先删除引用表中和该记录关联的行,之后再删除被引用表中的该行记录。然而需要说明的是,PostgreSQL为我们提供了更为方便的方式完成此类操作。
复制代码 代码如下:
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text
);
CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT, --限制选项
order_id integer REFERENCES orders ON DELETE CASCADE, --级联删除选项
quantity integer,
PRIMARY KEY (product_no, order_id)
);
限制和级联删除是两种最常见的选项。RESTRICT 禁止删除被引用的行。 NO ACTION 的意思是如果在检查约束的时候,如果还存在任何引用行,则抛出错误; 如果你不声明任何东西,那么它就是缺省的行为。(这两个选择的实际区别是,NO ACTION 允许约束检查推迟到事务的晚些时候,而 RESTRICT 不行。) CASCADE声明在删除一个被引用的行的时候,引用它的行也会被自动删除掉。 在外键字段上的动作还有两个选项: SET NULL 和 SET DEFAULT。 这样会导致在被引用行删除的时候,引用它们的字段分别设置为空或者缺省值。 请注意这些选项并不能让你逃脱被观察和约束的境地。比如,如果一个动作声明 SET DEFAULT,但是缺省值并不能满足外键,那么动作就会失败。类似ON DELETE,还有ON UPDATE 选项,它是在被引用字段修改(更新)的时候调用的。可用的动作是一样的。
二、系统字段:
PostgreSQL的每个数据表中都包含几个隐含定义的系统字段。因此,这些名字不能用于用户定义的字段名。这些系统字段的功能有些类似于Oracle中的rownum和rowid等。
oid: 行的对象标识符(对象ID)。这个字段只有在创建表的时候使用了WITH OIDS,或者是设置了配置参数default_with_oids时出现。这个字段的类型是oid(和字段同名)。
tableoid: 包含本行的表的OID。这个字段对那些从继承层次中选取的查询特别有用,因为如果没有它的话,我们就很难说明一行来自哪个独立的表。tableoid可以和pg_class的oid字段连接起来获取表名字。
xmin: 插入该行版本的事务的标识(事务ID)。
cmin: 在插入事务内部的命令标识(从零开始)。
xmax: 删除事务的标识(事务ID),如果不是被删除的行版本,那么是零。
cmax: 在删除事务内部的命令标识符,或者是零。
ctid: 一个行版本在它所处的表内的物理位置。请注意,尽管ctid可以用于非常快速地定位行版本,但每次VACUUM FULL之后,一个行的ctid都会被更新或者移动。因此ctid是不能作为长期的行标识符的。
OID是32位的量,是在同一个集群内通用的计数器上赋值的。对于一个大型或者长时间使用的数据库,这个计数器是有可能重叠的。因此,假设OID是唯一的是非常错误的,除非你自己采取了措施来保证它们是唯一的。如果你需要标识表中的行,我们强烈建议使用序列号生成器。
三、表的修改:
1. 增加字段:
复制代码 代码如下:
ALTER TABLE products ADD COLUMN description text;
新增的字段对于表中已经存在的行而言最初将先填充所给出的缺省值(如果你没有声明DEFAULT子句,那么缺省是空值)。
在新增字段时,可以同时给该字段指定约束。
复制代码 代码如下:
ALTER TABLE products ADD COLUMN description text CHECK(description <> '');
2. 删除字段:
复制代码 代码如下:
ALTER TABLE products DROP COLUMN description;
如果该表为被引用表,该字段为被引用字段,那么上面的删除操作将会失败。如果要想在删除被引用字段的同时级联的删除其所有引用字段,可以采用下面的语法形式。
复制代码 代码如下:
ALTER TABLE products DROP COLUMN description CASCADE;
3. 增加约束:
复制代码 代码如下:
ALTER TABLE products ADD CHECK(name <> ''); --增加一个表级约束
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE(product_no);--增加命名的唯一性约束。
ALTER TABLE products ADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增加外键约束。
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; --增加一个非空约束。
4. 删除约束:
复制代码 代码如下:
ALTER TABLE products DROP CONSTRAINT some_name;
对于显示命名的约束,可以根据其名称直接删除,对于隐式自动命名的约束,可以通过psql的\d tablename来获取该约束的名字。和删除字段一样,如果你想删除有着被依赖关系地约束,你需要用CASCADE。一个例子是某个外键约束依赖被引用字段上的唯一约束或者主键约束。如:
复制代码 代码如下:
MyTest=# \d products
Table "public.products"
Column | Type | Modifiers
------------+---------+-----------
product_no | integer |
name | text |
price | numeric |
Check constraints:
"positive_price" CHECK (price > 0::numeric)
和其他约束不同的是,非空约束没有名字,因此只能通过下面的方式删除:
复制代码 代码如下:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
5. 改变字段的缺省值:
在为已有字段添加缺省值时,不会影响任何表中现有的数据行, 它只是为将来INSERT命令改变缺省值。
复制代码 代码如下:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
下面为删除缺省值:
复制代码 代码如下:
ALTER TABLE products ALTER COLUMN price DROP DEFAULT
6. 修改字段的数据类型:
只有在字段里现有的每个项都可以用一个隐含的类型转换转换成新的类型时才可能成功。比如当前的数据都是整型,而转换的目标类型为numeric或varchar,这样的转换一般都可以成功。与此同时,PostgreSQL还将试图把字段的缺省值(如果存在)转换成新的类型, 还有涉及该字段的任何约束。但是这些转换可能失败,或者可能生成奇怪的结果。 在修改某字段类型之前,你最好删除那些约束,然后再把自己手工修改过的添加上去。
复制代码 代码如下:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
7. 修改字段名:
复制代码 代码如下:
ALTER TABLE products RENAME COLUMN product_no TO product_number;
8. 修改表名:
复制代码 代码如下:
ALTER TABLE products RENAME TO items;
四、权限:
只有表的所有者才能修改或者删除表的权限。要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令。
需要指出的是,PUBLIC是特殊"用户"可以用于将权限赋予系统中的每一个用户。在声明权限的位置写ALL则将所有的与该对象类型相关的权限都赋予出去。
复制代码 代码如下:
GRANT UPDATE ON table_name TO user; --将表的更新权限赋予指定的user。
GRANT SELECT ON table_name TO GROUP group; --将表的select权限赋予指定的组。
REVOKE ALL ON table_name FROM PUBLIC; --将表的所有权限从Public撤销。
最初,只有对象所有者(或者超级用户)可以赋予或者撤销对象的权限。但是,我们可以赋予一个"with grant option"权限,这样就给接受权限的人以授予该权限给其它人的权限。如果授予选项后来被撤销,那么所有那些从这个接受者接受了权限的用户(直接或者通过级连的授权)都将失去该权限。
这里需要特别说明的是,该博客中的大部分案例和段落均取自于PostgreSQL中文文档,如转载本系列博客,请同样注明该出处。