1004 lines
21 KiB
Markdown
1004 lines
21 KiB
Markdown
# PostgreSQL Mac 端使用手册
|
||
|
||
## 目录
|
||
|
||
1. [安装 PostgreSQL](#一安装-postgresql)
|
||
2. [连接数据库](#二连接数据库)
|
||
3. [查看所有数据库](#三查看所有数据库)
|
||
4. [创建数据库](#四创建数据库)
|
||
5. [切换数据库](#五切换数据库)
|
||
6. [查看表](#六查看表)
|
||
7. [创建表](#七创建表)
|
||
8. [常用操作命令](#八常用操作命令)
|
||
|
||
---
|
||
|
||
## 一、安装 PostgreSQL
|
||
|
||
### 1.1 使用 Homebrew 安装(推荐)
|
||
|
||
```bash
|
||
# 安装 PostgreSQL(推荐使用最新版本)
|
||
brew install postgresql@18
|
||
|
||
# 或者安装其他版本
|
||
brew install postgresql@18
|
||
brew install postgresql@18
|
||
```
|
||
|
||
### 1.2 启动 PostgreSQL 服务
|
||
|
||
```bash
|
||
# 启动服务(开机自启)
|
||
brew services start postgresql@18
|
||
|
||
# 停止服务
|
||
brew services stop postgresql@18
|
||
|
||
# 重启服务
|
||
brew services restart postgresql@18
|
||
|
||
# 查看服务状态
|
||
brew services list
|
||
```
|
||
|
||
### 1.3 验证安装
|
||
|
||
```bash
|
||
# 查看版本
|
||
psql --version
|
||
|
||
# 查看 PostgreSQL 是否运行
|
||
pg_isready
|
||
```
|
||
|
||
---
|
||
|
||
## 二、连接数据库
|
||
|
||
### 2.1 使用 psql 命令行连接
|
||
|
||
```bash
|
||
# 方式1:连接到默认数据库(使用当前系统用户名)
|
||
psql
|
||
|
||
# 方式2:连接到指定数据库
|
||
psql -d postgres
|
||
|
||
# 方式3:指定用户名和数据库
|
||
psql -U postgres -d postgres
|
||
|
||
# 方式4:指定主机、端口、用户名和数据库
|
||
psql -h localhost -p 5432 -U postgres -d postgres
|
||
|
||
# 方式5:连接时输入密码(推荐用于脚本)
|
||
PGPASSWORD=your_password psql -U postgres -d postgres
|
||
```
|
||
|
||
### 2.2 连接后的提示符
|
||
|
||
连接成功后,你会看到类似这样的提示符:
|
||
|
||
```
|
||
postgres=#
|
||
```
|
||
|
||
- `postgres` 是当前连接的数据库名
|
||
- `#` 表示你是超级用户(`$` 表示普通用户)
|
||
|
||
### 2.3 退出连接
|
||
|
||
```sql
|
||
-- 方式1:使用命令
|
||
\q
|
||
|
||
-- 方式2:使用快捷键
|
||
Ctrl + D
|
||
```
|
||
|
||
---
|
||
|
||
## 三、查看所有数据库
|
||
|
||
### 3.1 在 psql 中查看
|
||
|
||
```sql
|
||
-- 方式1:使用命令(推荐)
|
||
\l
|
||
|
||
-- 方式2:使用详细模式
|
||
\l+
|
||
|
||
-- 方式3:使用 SQL 查询
|
||
SELECT datname FROM pg_database;
|
||
|
||
-- 方式4:查看数据库详细信息
|
||
SELECT
|
||
datname AS "数据库名",
|
||
pg_size_pretty(pg_database_size(datname)) AS "大小",
|
||
datcollate AS "排序规则",
|
||
datctype AS "字符集"
|
||
FROM pg_database
|
||
ORDER BY datname;
|
||
```
|
||
|
||
### 3.2 在命令行中查看(不进入 psql)
|
||
|
||
```bash
|
||
# 列出所有数据库
|
||
psql -l
|
||
|
||
# 或者
|
||
psql -U postgres -l
|
||
```
|
||
|
||
---
|
||
|
||
## 四、创建数据库
|
||
|
||
### 4.1 基本语法
|
||
|
||
```sql
|
||
CREATE DATABASE database_name;
|
||
```
|
||
|
||
### 4.2 创建数据库示例
|
||
|
||
```sql
|
||
-- 示例1:创建简单数据库
|
||
CREATE DATABASE myapp;
|
||
|
||
-- 示例2:创建数据库(指定编码和排序规则)
|
||
CREATE DATABASE myapp
|
||
WITH ENCODING 'UTF8'
|
||
LC_COLLATE='en_US.UTF-8'
|
||
LC_CTYPE='en_US.UTF-8';
|
||
|
||
-- 示例3:创建数据库(指定所有者)
|
||
CREATE DATABASE myapp OWNER username;
|
||
|
||
-- 示例4:创建数据库(指定模板)
|
||
CREATE DATABASE myapp TEMPLATE template0;
|
||
```
|
||
|
||
### 4.3 创建数据库的完整选项
|
||
|
||
```sql
|
||
CREATE DATABASE database_name
|
||
[ [ WITH ] [ OWNER [=] user_name ]
|
||
[ TEMPLATE [=] template ]
|
||
[ ENCODING [=] encoding ]
|
||
[ LC_COLLATE [=] lc_collate ]
|
||
[ LC_CTYPE [=] lc_ctype ]
|
||
[ TABLESPACE [=] tablespace_name ]
|
||
[ ALLOW_CONNECTIONS [=] allowconn ]
|
||
[ CONNECTION LIMIT [=] connlimit ]
|
||
[ IS_TEMPLATE [=] istemplate ] ];
|
||
```
|
||
|
||
### 4.4 常用参数说明
|
||
|
||
| 参数 | 说明 | 示例 |
|
||
|------|------|------|
|
||
| `OWNER` | 数据库所有者 | `OWNER myuser` |
|
||
| `TEMPLATE` | 模板数据库 | `TEMPLATE template0` |
|
||
| `ENCODING` | 字符编码 | `ENCODING 'UTF8'` |
|
||
| `LC_COLLATE` | 排序规则 | `LC_COLLATE='en_US.UTF-8'` |
|
||
| `LC_CTYPE` | 字符分类 | `LC_CTYPE='en_US.UTF-8'` |
|
||
|
||
### 4.5 创建数据库的完整示例
|
||
|
||
```sql
|
||
-- 创建生产环境数据库
|
||
CREATE DATABASE vest_mind_prod
|
||
WITH
|
||
OWNER = postgres
|
||
ENCODING = 'UTF8'
|
||
LC_COLLATE = 'en_US.UTF-8'
|
||
LC_CTYPE = 'en_US.UTF-8'
|
||
TEMPLATE = template0
|
||
CONNECTION LIMIT = 100;
|
||
|
||
-- 创建开发环境数据库
|
||
CREATE DATABASE vest_mind_dev
|
||
WITH
|
||
OWNER = postgres
|
||
ENCODING = 'UTF8'
|
||
TEMPLATE = template0;
|
||
```
|
||
|
||
### 4.6 验证数据库是否创建成功
|
||
|
||
```sql
|
||
-- 方式1:查看所有数据库(推荐)
|
||
\l
|
||
|
||
-- 方式2:使用 SQL 查询
|
||
SELECT datname FROM pg_database WHERE datname = 'database_name';
|
||
|
||
-- 方式3:查看数据库详细信息
|
||
SELECT
|
||
datname AS "数据库名",
|
||
pg_size_pretty(pg_database_size(datname)) AS "大小",
|
||
datcollate AS "排序规则",
|
||
datctype AS "字符集"
|
||
FROM pg_database
|
||
WHERE datname = 'database_name';
|
||
```
|
||
|
||
### 4.7 创建数据库的注意事项
|
||
|
||
1. **数据库名称规则:**
|
||
- 必须以字母开头
|
||
- 只能包含字母、数字、下划线和连字符
|
||
- 不能使用 PostgreSQL 保留关键字
|
||
- 建议使用小写字母和下划线
|
||
|
||
2. **权限要求:**
|
||
- 需要 `CREATEDB` 权限
|
||
- 超级用户(如 `postgres`)可以创建任何数据库
|
||
|
||
3. **模板数据库:**
|
||
- `template0`:干净的模板,推荐使用
|
||
- `template1`:默认模板,可以修改
|
||
- 自定义模板:基于现有数据库创建
|
||
|
||
4. **字符编码:**
|
||
- 推荐使用 `UTF8` 编码
|
||
- 确保 `LC_COLLATE` 和 `LC_CTYPE` 设置正确
|
||
|
||
### 4.8 创建数据库后立即使用
|
||
|
||
```sql
|
||
-- 创建数据库
|
||
CREATE DATABASE myapp;
|
||
|
||
-- 切换到新创建的数据库
|
||
\c myapp
|
||
|
||
-- 或者退出后重新连接
|
||
\q
|
||
psql -d myapp
|
||
```
|
||
|
||
### 4.9 删除数据库
|
||
|
||
```sql
|
||
-- 删除数据库(注意:需要先断开所有连接)
|
||
DROP DATABASE database_name;
|
||
|
||
-- 删除数据库(如果存在)
|
||
DROP DATABASE IF EXISTS database_name;
|
||
|
||
-- 强制删除数据库(终止所有连接后删除)
|
||
-- 首先终止所有连接
|
||
SELECT pg_terminate_backend(pid)
|
||
FROM pg_stat_activity
|
||
WHERE datname = 'database_name' AND pid <> pg_backend_pid();
|
||
|
||
-- 然后删除
|
||
DROP DATABASE database_name;
|
||
```
|
||
|
||
### 4.10 重命名数据库
|
||
|
||
```sql
|
||
-- 重命名数据库
|
||
ALTER DATABASE old_name RENAME TO new_name;
|
||
```
|
||
|
||
---
|
||
|
||
## 五、切换数据库
|
||
|
||
### 5.1 在 psql 中切换
|
||
|
||
```sql
|
||
-- 使用 \c 命令切换数据库
|
||
\c database_name
|
||
|
||
-- 切换到指定数据库并显示连接信息
|
||
\c database_name username
|
||
|
||
-- 查看当前连接的数据库
|
||
SELECT current_database();
|
||
|
||
-- 或者使用命令
|
||
\conninfo
|
||
```
|
||
|
||
### 5.2 退出后重新连接
|
||
|
||
```bash
|
||
# 退出当前连接
|
||
\q
|
||
|
||
# 重新连接到指定数据库
|
||
psql -d database_name
|
||
```
|
||
|
||
---
|
||
|
||
## 六、查看表
|
||
|
||
### 6.1 查看当前数据库中的所有表
|
||
|
||
```sql
|
||
-- 方式1:使用命令(推荐)
|
||
\dt
|
||
|
||
-- 方式2:查看详细信息(包括大小、描述等)
|
||
\dt+
|
||
|
||
-- 方式3:使用 SQL 查询
|
||
SELECT
|
||
schemaname AS "模式",
|
||
tablename AS "表名"
|
||
FROM pg_tables
|
||
WHERE schemaname = 'public'
|
||
ORDER BY tablename;
|
||
|
||
-- 方式4:查看所有表(包括系统表)
|
||
\dt *.*
|
||
```
|
||
|
||
### 6.2 查看表结构
|
||
|
||
```sql
|
||
-- 方式1:查看表结构(推荐)
|
||
\d table_name
|
||
|
||
-- 方式2:查看详细信息(包括索引、约束等)
|
||
\d+ table_name
|
||
|
||
-- 方式3:只查看列信息
|
||
\d table_name
|
||
|
||
-- 方式4:使用 SQL 查询列信息
|
||
SELECT
|
||
column_name AS "列名",
|
||
data_type AS "数据类型",
|
||
character_maximum_length AS "最大长度",
|
||
is_nullable AS "可空",
|
||
column_default AS "默认值"
|
||
FROM information_schema.columns
|
||
WHERE table_name = 'table_name'
|
||
ORDER BY ordinal_position;
|
||
```
|
||
|
||
### 6.3 查看表的索引
|
||
|
||
```sql
|
||
-- 查看表的所有索引
|
||
\d table_name
|
||
|
||
-- 或者使用 SQL
|
||
SELECT
|
||
indexname AS "索引名",
|
||
indexdef AS "索引定义"
|
||
FROM pg_indexes
|
||
WHERE tablename = 'table_name';
|
||
```
|
||
|
||
### 6.4 查看表的约束
|
||
|
||
```sql
|
||
-- 查看表的所有约束
|
||
\d table_name
|
||
|
||
-- 或者使用 SQL
|
||
SELECT
|
||
conname AS "约束名",
|
||
contype AS "约束类型",
|
||
pg_get_constraintdef(oid) AS "约束定义"
|
||
FROM pg_constraint
|
||
WHERE conrelid = 'table_name'::regclass;
|
||
```
|
||
|
||
---
|
||
|
||
## 七、创建表
|
||
|
||
### 7.1 基本语法
|
||
|
||
```sql
|
||
CREATE TABLE table_name (
|
||
column1_name data_type [constraints],
|
||
column2_name data_type [constraints],
|
||
...
|
||
);
|
||
```
|
||
|
||
### 7.2 创建表示例
|
||
|
||
```sql
|
||
-- 示例1:创建用户表
|
||
CREATE TABLE users (
|
||
user_id BIGSERIAL PRIMARY KEY,
|
||
username VARCHAR(100) NOT NULL UNIQUE,
|
||
email VARCHAR(100) UNIQUE,
|
||
password_hash VARCHAR(255) NOT NULL,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 示例2:创建订单表(带外键)
|
||
CREATE TABLE orders (
|
||
order_id BIGSERIAL PRIMARY KEY,
|
||
user_id BIGINT NOT NULL,
|
||
total_amount DECIMAL(10, 2) NOT NULL,
|
||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- 示例3:创建带检查约束的表
|
||
CREATE TABLE products (
|
||
product_id BIGSERIAL PRIMARY KEY,
|
||
name VARCHAR(100) NOT NULL,
|
||
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),
|
||
stock INTEGER NOT NULL DEFAULT 0 CHECK (stock >= 0),
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 7.3 常用数据类型
|
||
|
||
| 数据类型 | 说明 | 示例 |
|
||
|---------|------|------|
|
||
| `BIGSERIAL` | 自增整数(64位) | `user_id BIGSERIAL PRIMARY KEY` |
|
||
| `BIGINT` | 大整数(64位) | `user_id BIGINT` |
|
||
| `INTEGER` | 整数(32位) | `age INTEGER` |
|
||
| `VARCHAR(n)` | 可变长度字符串 | `username VARCHAR(100)` |
|
||
| `TEXT` | 长文本 | `description TEXT` |
|
||
| `DECIMAL(p,s)` | 精确小数 | `price DECIMAL(10, 2)` |
|
||
| `BOOLEAN` | 布尔值 | `is_active BOOLEAN` |
|
||
| `DATE` | 日期 | `birthday DATE` |
|
||
| `TIMESTAMP` | 时间戳 | `created_at TIMESTAMP` |
|
||
| `JSONB` | JSON 二进制 | `metadata JSONB` |
|
||
|
||
### 7.4 常用约束
|
||
|
||
```sql
|
||
-- PRIMARY KEY:主键
|
||
user_id BIGSERIAL PRIMARY KEY
|
||
|
||
-- NOT NULL:非空
|
||
username VARCHAR(100) NOT NULL
|
||
|
||
-- UNIQUE:唯一
|
||
email VARCHAR(100) UNIQUE
|
||
|
||
-- DEFAULT:默认值
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
|
||
-- CHECK:检查约束
|
||
price DECIMAL(10, 2) CHECK (price > 0)
|
||
|
||
-- FOREIGN KEY:外键
|
||
user_id BIGINT REFERENCES users(user_id)
|
||
|
||
-- 组合约束
|
||
CONSTRAINT pk_user PRIMARY KEY (user_id),
|
||
CONSTRAINT uk_email UNIQUE (email),
|
||
CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES users(user_id)
|
||
```
|
||
|
||
### 7.5 验证表是否创建成功
|
||
|
||
```sql
|
||
-- 查看所有表
|
||
\dt
|
||
|
||
-- 查看表结构
|
||
\d table_name
|
||
|
||
-- 查看表是否存在
|
||
SELECT EXISTS (
|
||
SELECT FROM information_schema.tables
|
||
WHERE table_name = 'table_name'
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## 八、常用操作命令
|
||
|
||
### 8.1 数据库操作
|
||
|
||
```sql
|
||
-- 创建数据库
|
||
CREATE DATABASE database_name;
|
||
|
||
-- 创建数据库(指定编码)
|
||
CREATE DATABASE database_name
|
||
WITH ENCODING 'UTF8'
|
||
LC_COLLATE='en_US.UTF-8'
|
||
LC_CTYPE='en_US.UTF-8';
|
||
|
||
-- 删除数据库
|
||
DROP DATABASE database_name;
|
||
|
||
-- 重命名数据库
|
||
ALTER DATABASE old_name RENAME TO new_name;
|
||
```
|
||
|
||
### 8.2 表操作
|
||
|
||
```sql
|
||
-- 删除表
|
||
DROP TABLE table_name;
|
||
|
||
-- 删除表(如果存在)
|
||
DROP TABLE IF EXISTS table_name;
|
||
|
||
-- 清空表数据(保留表结构)
|
||
TRUNCATE TABLE table_name;
|
||
|
||
-- 重命名表
|
||
ALTER TABLE old_name RENAME TO new_name;
|
||
|
||
-- 添加列
|
||
ALTER TABLE table_name ADD COLUMN column_name data_type;
|
||
|
||
-- 删除列
|
||
ALTER TABLE table_name DROP COLUMN column_name;
|
||
|
||
-- 修改列类型
|
||
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_type;
|
||
|
||
-- 添加约束
|
||
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (condition);
|
||
```
|
||
|
||
### 8.3 数据操作(CRUD)
|
||
|
||
```sql
|
||
-- 插入数据
|
||
INSERT INTO users (username, email, password_hash)
|
||
VALUES ('john', 'john@example.com', 'hashed_password');
|
||
|
||
-- 查询数据
|
||
SELECT * FROM users;
|
||
SELECT username, email FROM users WHERE user_id = 1;
|
||
|
||
-- 更新数据
|
||
UPDATE users SET email = 'newemail@example.com' WHERE user_id = 1;
|
||
|
||
-- 删除数据
|
||
DELETE FROM users WHERE user_id = 1;
|
||
```
|
||
|
||
### 8.4 psql 常用命令
|
||
|
||
```sql
|
||
-- 帮助命令
|
||
\? -- 查看所有命令
|
||
\h -- SQL 命令帮助
|
||
\h CREATE TABLE -- 查看特定 SQL 命令帮助
|
||
|
||
-- 数据库相关
|
||
\l -- 列出所有数据库
|
||
\c dbname -- 连接到数据库
|
||
\conninfo -- 显示当前连接信息
|
||
|
||
-- 表相关
|
||
\dt -- 列出所有表
|
||
\d table -- 查看表结构
|
||
\d+ table -- 查看表详细信息
|
||
|
||
-- 其他
|
||
\q -- 退出
|
||
\du -- 列出所有用户
|
||
\dn -- 列出所有模式(schema)
|
||
\df -- 列出所有函数
|
||
\timing -- 开启/关闭执行时间显示
|
||
\x -- 开启/关闭扩展显示(用于宽表)
|
||
```
|
||
|
||
### 8.5 查看执行计划
|
||
|
||
```sql
|
||
-- 查看查询执行计划
|
||
EXPLAIN SELECT * FROM users WHERE user_id = 1;
|
||
|
||
-- 查看详细执行计划(包含实际执行时间)
|
||
EXPLAIN ANALYZE SELECT * FROM users WHERE user_id = 1;
|
||
```
|
||
|
||
---
|
||
|
||
## 九、实用技巧
|
||
|
||
### 9.1 设置用户名和密码
|
||
|
||
#### 9.1.1 为现有用户设置密码
|
||
|
||
```sql
|
||
-- 为 postgres 用户设置密码
|
||
ALTER USER postgres WITH PASSWORD 'your_password';
|
||
|
||
-- 为当前用户设置密码
|
||
ALTER USER current_user WITH PASSWORD 'your_password';
|
||
|
||
-- 查看当前用户
|
||
SELECT current_user;
|
||
```
|
||
|
||
#### 9.1.2 创建新用户并设置密码
|
||
|
||
```sql
|
||
-- 创建新用户并设置密码
|
||
CREATE USER username WITH PASSWORD 'your_password';
|
||
|
||
-- 创建用户并指定更多选项
|
||
CREATE USER username
|
||
WITH PASSWORD 'your_password'
|
||
CREATEDB -- 允许创建数据库
|
||
CREATEROLE; -- 允许创建角色
|
||
|
||
-- 查看所有用户
|
||
\du
|
||
```
|
||
|
||
#### 9.1.3 为用户授予数据库权限
|
||
|
||
```sql
|
||
-- 授予数据库的所有权限
|
||
GRANT ALL PRIVILEGES ON DATABASE database_name TO username;
|
||
|
||
-- 授予特定权限
|
||
GRANT CONNECT ON DATABASE database_name TO username;
|
||
GRANT CREATE ON DATABASE database_name TO username;
|
||
|
||
-- 授予表的权限(需要先连接到数据库)
|
||
\c database_name
|
||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO username;
|
||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO username;
|
||
|
||
-- 授予未来创建的表和序列的权限
|
||
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
||
GRANT ALL ON TABLES TO username;
|
||
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
||
GRANT ALL ON SEQUENCES TO username;
|
||
```
|
||
|
||
#### 9.1.4 完整示例:为新数据库设置用户和密码
|
||
|
||
```sql
|
||
-- 1. 连接到 PostgreSQL(使用超级用户)
|
||
psql -d postgres
|
||
|
||
-- 2. 创建新用户
|
||
CREATE USER vest_mind_user WITH PASSWORD 'your_secure_password';
|
||
|
||
-- 3. 授予数据库权限
|
||
GRANT ALL PRIVILEGES ON DATABASE vest_mind TO vest_mind_user;
|
||
|
||
-- 4. 切换到目标数据库
|
||
\c vest_mind
|
||
|
||
-- 5. 授予 schema 权限
|
||
GRANT ALL ON SCHEMA public TO vest_mind_user;
|
||
|
||
-- 6. 授予现有表的权限
|
||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO vest_mind_user;
|
||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO vest_mind_user;
|
||
|
||
-- 7. 授予未来创建的表和序列的权限
|
||
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
||
GRANT ALL ON TABLES TO vest_mind_user;
|
||
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
||
GRANT ALL ON SEQUENCES TO vest_mind_user;
|
||
|
||
-- 8. 验证权限
|
||
\du vest_mind_user
|
||
```
|
||
|
||
#### 9.1.5 使用新用户连接数据库
|
||
|
||
```bash
|
||
# 方式1:使用密码连接
|
||
psql -U vest_mind_user -d vest_mind
|
||
|
||
# 方式2:使用环境变量(用于脚本)
|
||
PGPASSWORD=your_secure_password psql -U vest_mind_user -d vest_mind
|
||
|
||
# 方式3:在连接字符串中指定
|
||
psql "postgresql://vest_mind_user:your_secure_password@localhost:5432/vest_mind"
|
||
```
|
||
|
||
#### 9.1.6 修改用户密码
|
||
|
||
```sql
|
||
-- 修改用户密码
|
||
ALTER USER username WITH PASSWORD 'new_password';
|
||
|
||
-- 强制用户下次登录时修改密码
|
||
ALTER USER username WITH PASSWORD 'new_password' VALID UNTIL '2025-12-31';
|
||
```
|
||
|
||
#### 9.1.7 删除用户
|
||
|
||
```sql
|
||
-- 删除用户(如果用户拥有对象,需要先转移所有权)
|
||
DROP USER username;
|
||
|
||
-- 或者先转移所有权再删除
|
||
REASSIGN OWNED BY username TO postgres;
|
||
DROP OWNED BY username;
|
||
DROP USER username;
|
||
```
|
||
|
||
#### 9.1.8 配置 PostgreSQL 认证方式(可选)
|
||
|
||
如果需要强制使用密码认证,可以编辑 PostgreSQL 配置文件:
|
||
|
||
```bash
|
||
# 找到配置文件位置(Homebrew 安装)
|
||
# 通常在:/opt/homebrew/var/postgresql@18/pg_hba.conf
|
||
# 或:/usr/local/var/postgresql@18/pg_hba.conf
|
||
|
||
# 编辑配置文件
|
||
nano /opt/homebrew/var/postgresql@18/pg_hba.conf
|
||
```
|
||
|
||
在 `pg_hba.conf` 文件中,找到类似这样的行:
|
||
|
||
```
|
||
# TYPE DATABASE USER ADDRESS METHOD
|
||
local all all trust
|
||
host all all 127.0.0.1/32 trust
|
||
```
|
||
|
||
修改为需要密码认证:
|
||
|
||
```
|
||
# TYPE DATABASE USER ADDRESS METHOD
|
||
local all all md5
|
||
host all all 127.0.0.1/32 md5
|
||
```
|
||
|
||
然后重启 PostgreSQL 服务:
|
||
|
||
```bash
|
||
brew services restart postgresql@18
|
||
```
|
||
|
||
**认证方式说明:**
|
||
- `trust`:无需密码(当前默认)
|
||
- `md5`:使用 MD5 加密的密码
|
||
- `password`:使用明文密码(不推荐)
|
||
- `scram-sha-256`:使用 SCRAM-SHA-256 加密(推荐,PostgreSQL 10+)
|
||
|
||
### 9.2 导出和导入数据
|
||
|
||
```bash
|
||
# 导出数据库
|
||
pg_dump -U postgres -d database_name > backup.sql
|
||
|
||
# 导入数据库
|
||
psql -U postgres -d database_name < backup.sql
|
||
|
||
# 导出表
|
||
pg_dump -U postgres -d database_name -t table_name > table_backup.sql
|
||
|
||
# 导出为 CSV
|
||
psql -U postgres -d database_name -c "COPY table_name TO STDOUT WITH CSV HEADER" > data.csv
|
||
```
|
||
|
||
### 9.3 查看数据库大小
|
||
|
||
```sql
|
||
-- 查看当前数据库大小
|
||
SELECT pg_size_pretty(pg_database_size(current_database()));
|
||
|
||
-- 查看所有数据库大小
|
||
SELECT
|
||
datname AS "数据库名",
|
||
pg_size_pretty(pg_database_size(datname)) AS "大小"
|
||
FROM pg_database
|
||
ORDER BY pg_database_size(datname) DESC;
|
||
|
||
-- 查看表大小
|
||
SELECT
|
||
schemaname AS "模式",
|
||
tablename AS "表名",
|
||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS "大小"
|
||
FROM pg_tables
|
||
WHERE schemaname = 'public'
|
||
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
|
||
```
|
||
|
||
### 9.4 查看连接信息
|
||
|
||
```sql
|
||
-- 查看当前连接
|
||
\conninfo
|
||
|
||
-- 查看所有活动连接
|
||
SELECT
|
||
pid,
|
||
usename,
|
||
datname,
|
||
client_addr,
|
||
state,
|
||
query
|
||
FROM pg_stat_activity
|
||
WHERE datname IS NOT NULL;
|
||
```
|
||
|
||
### 9.5 环境变量配置(可选)
|
||
|
||
在 `~/.zshrc` 或 `~/.bash_profile` 中添加:
|
||
|
||
```bash
|
||
# PostgreSQL 路径配置
|
||
export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"
|
||
export LDFLAGS="-L/opt/homebrew/opt/postgresql@18/lib"
|
||
export CPPFLAGS="-I/opt/homebrew/opt/postgresql@18/include"
|
||
|
||
# PostgreSQL 连接别名(可选)
|
||
alias pgstart='brew services start postgresql@18'
|
||
alias pgstop='brew services stop postgresql@18'
|
||
alias pgrestart='brew services restart postgresql@18'
|
||
alias pgstatus='brew services list | grep postgresql'
|
||
```
|
||
|
||
---
|
||
|
||
## 十、快速参考
|
||
|
||
### 10.1 常用连接方式
|
||
|
||
```bash
|
||
# 最简单的方式
|
||
psql
|
||
|
||
# 指定数据库
|
||
psql -d mydb
|
||
|
||
# 指定用户和数据库
|
||
psql -U postgres -d mydb
|
||
|
||
# 带密码连接(用于脚本)
|
||
PGPASSWORD=password psql -U postgres -d mydb
|
||
```
|
||
|
||
### 10.2 常用 SQL 命令速查
|
||
|
||
```sql
|
||
-- 数据库
|
||
CREATE DATABASE dbname;
|
||
DROP DATABASE dbname;
|
||
\l
|
||
|
||
-- 表
|
||
CREATE TABLE tname (...);
|
||
DROP TABLE tname;
|
||
\dt
|
||
\d tname
|
||
|
||
-- 数据
|
||
INSERT INTO tname VALUES (...);
|
||
SELECT * FROM tname;
|
||
UPDATE tname SET ... WHERE ...;
|
||
DELETE FROM tname WHERE ...;
|
||
|
||
-- 用户
|
||
CREATE USER username WITH PASSWORD 'password';
|
||
\du
|
||
```
|
||
|
||
### 10.3 故障排查
|
||
|
||
```bash
|
||
# 检查 PostgreSQL 是否运行
|
||
pg_isready
|
||
|
||
# 查看日志(Homebrew 安装)
|
||
tail -f /opt/homebrew/var/log/postgresql@18.log
|
||
|
||
# 或者
|
||
tail -f /usr/local/var/log/postgresql@18.log
|
||
|
||
# 重启服务
|
||
brew services restart postgresql@18
|
||
```
|
||
|
||
---
|
||
|
||
## 十一、示例:完整工作流程
|
||
|
||
```bash
|
||
# 1. 启动 PostgreSQL
|
||
brew services start postgresql@18
|
||
|
||
# 2. 连接到数据库
|
||
psql -d postgres
|
||
|
||
# 3. 创建数据库
|
||
CREATE DATABASE myapp;
|
||
|
||
# 4. 切换到新数据库
|
||
\c myapp
|
||
|
||
# 5. 创建表
|
||
CREATE TABLE users (
|
||
user_id BIGSERIAL PRIMARY KEY,
|
||
username VARCHAR(100) NOT NULL UNIQUE,
|
||
email VARCHAR(100) UNIQUE,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
# 6. 查看表
|
||
\dt
|
||
\d users
|
||
|
||
# 7. 插入数据
|
||
INSERT INTO users (username, email)
|
||
VALUES ('john', 'john@example.com');
|
||
|
||
# 8. 查询数据
|
||
SELECT * FROM users;
|
||
|
||
# 9. 退出
|
||
\q
|
||
```
|
||
|
||
---
|
||
|
||
## 十二、图形化工具推荐
|
||
|
||
### 12.1 pgAdmin
|
||
- 官网:https://www.pgadmin.org/
|
||
- 功能强大的 PostgreSQL 管理工具
|
||
|
||
### 12.2 DBeaver
|
||
- 官网:https://dbeaver.io/
|
||
- 免费、跨平台的数据库管理工具
|
||
|
||
### 12.3 TablePlus
|
||
- 官网:https://tableplus.com/
|
||
- Mac 上优秀的数据库管理工具(付费)
|
||
|
||
### 12.4 Postico
|
||
- 官网:https://eggerapps.at/postico/
|
||
- Mac 专用的 PostgreSQL 客户端(付费)
|
||
|
||
---
|
||
|
||
## 十三、常见问题
|
||
|
||
### Q1: 连接时提示 "password authentication failed"
|
||
**A:** 检查用户名和密码是否正确,或者重置 postgres 用户密码:
|
||
```sql
|
||
ALTER USER postgres WITH PASSWORD 'new_password';
|
||
```
|
||
|
||
### Q2: 找不到 psql 命令
|
||
**A:** 需要将 PostgreSQL 的 bin 目录添加到 PATH:
|
||
```bash
|
||
export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"
|
||
```
|
||
|
||
### Q3: 端口 5432 已被占用
|
||
**A:** 检查端口占用情况:
|
||
```bash
|
||
lsof -i :5432
|
||
```
|
||
|
||
### Q4: 如何查看 PostgreSQL 版本
|
||
**A:**
|
||
```bash
|
||
psql --version
|
||
# 或者在 psql 中
|
||
SELECT version();
|
||
```
|
||
|
||
---
|
||
|
||
**文档版本:** v1.0
|
||
**最后更新:** 2024年
|
||
|