简介
关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种结构化的方式来存储、组织和访问信息。
PostgreSQL,或者简称 Postgres,是一种关系数据库管理系统,提供了 SQL 查询语言的实现。它是许多小型和大型项目的热门选择,并且具有符合标准和许多高级功能的优势,如可靠的事务和并发性而无需读取锁定。
在本指南中,我们将演示如何在 Ubuntu 16.04 VPS 实例上安装 Postgres,并介绍一些基本的使用方法。
安装
Ubuntu 的默认软件仓库包含了 Postgres 软件包,因此我们可以使用 apt
软件包管理系统轻松安装这些软件。
由于这是我们在本次会话中第一次使用 apt
,我们需要刷新本地软件包索引。然后我们可以安装 Postgres 软件包和一个 -contrib
软件包,它添加了一些额外的实用工具和功能:
sudo apt-get update sudo apt-get install postgresql postgresql-contrib
现在我们的软件已安装完成,我们可以了解它的工作原理以及它与您可能使用过的类似数据库管理系统有何不同。
使用 PostgreSQL 角色和数据库
默认情况下,Postgres 使用一个称为 “角色” 的概念来处理身份验证和授权。在某些方面,这与常规的 Unix 风格帐户类似,但 Postgres 不区分用户和组,而是更倾向于更灵活的术语 “角色”。
在安装后,Postgres 被设置为使用 ident 身份验证,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统帐户关联起来。如果一个角色在 Postgres 中存在,具有相同名称的 Unix/Linux 用户名将能够以该角色登录。
有几种方法可以利用这个帐户来访问 Postgres。
切换到 postgres 帐户
安装过程创建了一个名为 postgres
的用户帐户,该帐户与默认的 Postgres 角色关联。为了使用 Postgres,我们可以登录到该帐户。
通过输入以下命令在服务器上切换到 postgres
帐户:
sudo -i -u postgres
现在您可以立即通过输入以下命令访问 Postgres 提示符:
psql
您将被登录并能够立即与数据库管理系统交互。
通过输入以下命令退出 PostgreSQL 提示符:
\q
您现在应该回到 postgres
Linux 命令提示符。
在不切换帐户的情况下访问 Postgres 提示符
您也可以直接使用 sudo
以 postgres
帐户运行您想要的命令。
例如,在上一个示例中,我们只是想要进入 Postgres 提示符。我们可以通过以下方式一步到位地以 postgres
用户使用 sudo
运行单个命令 psql
:
sudo -u postgres psql
这将直接将您登录到 Postgres,而不需要中间的 bash
shell。
同样,您可以通过输入以下命令退出交互式的 Postgres 会话:
\q
创建新角色
目前,我们只配置了数据库中的 postgres
角色。我们可以使用 createrole
命令从命令行创建新角色。--interactive
标志将提示您输入必要的值。
如果您以 postgres
帐户登录,您可以通过输入以下命令创建新用户:
createuser --interactive
如果您更喜欢在不切换到正常帐户的情况下为每个命令使用 sudo
,您可以输入以下命令:
sudo -u postgres createuser --interactive
该脚本将根据您的响应提示您进行一些选择,并根据您的响应执行正确的 Postgres 命令以创建符合您要求的用户。
输入要添加的角色名称:sammy 新角色是否为超级用户?(y/n) y
您可以通过传递一些额外的标志来获得更多控制。通过查看 man
页面上的选项来了解更多信息:
man createuser
创建新数据库
默认情况下,Postgres 身份验证系统假设将有一个与用于登录的角色同名的数据库,并且该角色可以访问该数据库。
因此,如果在上一节中,我们创建了一个名为 sammy
的用户,该角色将尝试连接到一个默认情况下也称为 sammy
的数据库。您可以使用 createdb
命令创建相应的数据库。
如果您以 postgres
帐户登录,您将输入类似以下内容的命令:
createdb sammy
如果您更喜欢在不切换到正常帐户的情况下为每个命令使用 sudo
,您将输入以下命令:
sudo -u postgres createdb sammy
用新角色打开 Postgres 提示符
要使用 ident
基于身份验证登录,您需要一个与您的 Postgres 角色和数据库名称相同的 Linux 用户。
如果您没有匹配的 Linux 用户可用,可以使用 adduser
命令创建一个。您需要使用具有 sudo
权限的帐户执行此操作(不要使用 postgres
用户登录):
sudo adduser sammy
一旦您有了适当的帐户,您可以通过以下方式切换并连接到数据库:
sudo -i -u sammy psql
或者,您可以内联执行:
sudo -u sammy psql
假设所有组件都已正确配置,您将自动登录。
如果要让用户连接到不同的数据库,可以通过以下方式指定数据库:
psql -d postgres
登录后,您可以通过输入以下内容检查当前连接信息:
\conninfo
您已连接到位于“/var/run/postgresql”套接字上端口“5432”的数据库“sammy”作为用户“sammy”。
如果您连接到非默认数据库或使用非默认用户,这可能很有用。
创建和删除表
现在您知道如何连接到 PostgreSQL 数据库系统,我们可以讨论如何完成一些基本任务。
首先,我们可以创建一个表来存储一些数据。让我们创建一个描述游乐场设备的表。
此命令的基本语法如下:
CREATE TABLE table_name ( column_name1 col_type (field_length) column_constraints, column_name2 col_type (field_length), column_name3 col_type (field_length) );
如您所见,我们为表指定了一个名称,然后定义了我们想要的列,以及列类型和字段数据的最大长度。我们还可以为每个列可选地添加表约束。
您可以在此处了解有关如何在 Postgres 中创建和管理表的更多信息。
对于我们的目的,我们将创建一个类似于以下内容的简单表:
CREATE TABLE playground ( equip_id serial PRIMARY KEY, type varchar (50) NOT NULL, color varchar (25) NOT NULL, location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')), install_date date );
我们创建了一个游乐场表,用于列出我们拥有的设备。这始于一个设备 ID,它是 serial
类型。此数据类型是自增整数。我们为此列添加了 primary key
约束,这意味着值必须是唯一且非空。
对于我们的两个列(equip_id
和 install_date
),我们没有指定字段长度。这是因为某些列类型不需要设置长度,因为长度由类型隐含确定。
然后,我们为设备的 type
和 color
创建了列,每个列都不能为空。我们创建了一个 location
列,并创建了一个约束,要求值必须是八个可能值之一。最后一列是一个记录我们安装设备日期的日期列。
我们可以通过输入以下内容查看我们的新表:
\d
List of relations Schema | Name | Type | Owner --------+-------------------------+----------+------- public | playground | table | sammy public | playground_equip_id_seq | sequence | sammy (2 rows)
我们的游乐场表在这里,但我们还有一个名为 playground_equip_id_seq
的东西,它是 sequence
类型。这是我们给 equip_id
列的 serial
类型的表示。这会跟踪序列中的下一个数字,并且会自动为此类型的列创建。
如果要仅查看表而不包括序列,可以输入:
\dt
List of relations Schema | Name | Type | Owner --------+------------+-------+------- public | playground | table | sammy (1 row)
在表中添加、查询和删除数据
现在我们有了一个表,我们可以向其中插入一些数据。
让我们添加一个滑梯和一个秋千。我们可以通过调用我们要添加的表,命名列,然后为每个列提供数据来添加我们的滑梯和秋千:
INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2014-04-28'); INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2010-08-16');
在输入数据时,应注意避免一些常见的问题。首先,请记住列名称不应带引号,但您输入的列值需要带引号。
另一件事需要注意的是,我们不为 equip_id
列输入值。这是因为每当在表中创建新行时,此列会自动生成。
然后,我们可以通过输入以下内容获取我们添加的信息:
SELECT * FROM playground;
equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 1 | slide | blue | south | 2014-04-28 2 | swing | yellow | northwest | 2010-08-16 (2 rows)
在这里,您可以看到我们的 equip_id
已成功填充,并且我们的其他所有数据都已正确组织。
如果游乐场的滑梯坏了,我们必须将其移除,我们也可以通过输入以下内容从表中删除行:
DELETE FROM playground WHERE type = 'slide';
如果再次查询我们的表,我们将看到我们的滑梯不再是表的一部分:
SELECT * FROM playground;
equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 2 | swing | yellow | northwest | 2010-08-16 (1 row)
如何向表中添加和删除列
如果我们想在创建表之后修改表以添加额外的列,我们可以很容易地实现这一点。
我们可以通过输入以下命令来添加一个列,以显示每个设备的最后一次维护访问日期:
ALTER TABLE playground ADD last_maint date;
如果再次查看表信息,您将看到新列已经添加(但尚未输入数据):
SELECT * FROM playground;
equip_id | type | color | location | install_date | last_maint ----------+-------+--------+-----------+--------------+------------ 2 | swing | yellow | northwest | 2010-08-16 | (1 row)
我们同样可以轻松地删除一列。如果我们发现我们的工作人员使用单独的工具来跟踪维护历史记录,我们可以通过输入以下命令在这里删除该列:
ALTER TABLE playground DROP last_maint;
如何在表中更新数据
我们知道如何向表中添加记录和删除记录,但我们还没有涉及如何修改现有条目。
您可以通过查询要更新的记录并将列设置为所需值来更新现有条目的值。我们可以查询“swing”记录(这将匹配表中的每个秋千),并将其颜色更改为“红色”。如果我们给秋千设置了油漆,这可能会很有用:
UPDATE playground SET color = 'red' WHERE type = 'swing';
我们可以通过再次查询我们的数据来验证操作是否成功:
SELECT * FROM playground;
equip_id | type | color | location | install_date ----------+-------+-------+-----------+-------------- 2 | swing | red | northwest | 2010-08-16 (1 row)
如您所见,我们的秋千现在被注册为红色。
结论
您现在已经在您的 Ubuntu 16.04 服务器上设置了 PostgreSQL。然而,Postgres 还有更多值得学习的地方。以下是一些涵盖如何使用 Postgres 的更多指南:
- 关系数据库管理系统的比较
- 学习如何创建和管理 Postgres 表
- 更好地管理角色和权限
- 使用 Select 在 Postgres 中编写查询
- 学习如何保护 PostgreSQL
- 学习如何备份 Postgres 数据库