PostgreSQL 基础命令

返回 PostgreSQL

本文汇总 psql库表 DDL增删改查与常用运维 SQL。类型与 JSONB 见 架构与数据类型;高级查询见 高级查询

对照:MySQL 基础命令


连接与 psql

# 本机默认用户 postgres
psql -U postgres
 
# 指定主机、端口、库
psql -h 127.0.0.1 -p 5432 -U app -d app_db
 
# 单次执行
psql -U app -d app_db -c "SELECT COUNT(*) FROM orders;"

psql 元命令(反斜杠)

命令说明
\l列出所有数据库
\c mydb切换数据库
\dt当前 schema 下所有表
\d users表结构
\du角色列表
\q退出

会话内常用 SQL

SELECT version();
SELECT current_database();
SELECT current_user;
SET client_encoding TO 'UTF8';

库与表(DDL)

数据库

CREATE DATABASE app_db
  ENCODING 'UTF8'
  LC_COLLATE 'en_US.UTF-8'
  LC_CTYPE 'en_US.UTF-8';
 
DROP DATABASE IF EXISTS test_db;

建表示例

CREATE TABLE users (
    id         BIGSERIAL PRIMARY KEY,
    name       VARCHAR(64)  NOT NULL,
    email      VARCHAR(128) NOT NULL UNIQUE,
    status     SMALLINT     NOT NULL DEFAULT 1,
    created_at TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);
 
CREATE INDEX idx_users_status_created ON users(status, created_at);

自增:SERIAL / BIGSERIAL架构与数据类型

改表

ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users ALTER COLUMN name TYPE VARCHAR(128);
ALTER TABLE users ADD CONSTRAINT uk_phone UNIQUE (phone);
ALTER TABLE users DROP CONSTRAINT uk_phone;
ALTER TABLE users DROP COLUMN phone;

删表 / 清空

DROP TABLE IF EXISTS tmp_import;
TRUNCATE TABLE logs_2023;   -- 快;有外键时需 TRUNCATE ... CASCADE

查询(SELECT)

SELECT id, name, email FROM users WHERE status = 1;
SELECT * FROM users WHERE id = 1001;
SELECT id, name FROM users ORDER BY created_at DESC LIMIT 20;
SELECT id, name FROM users WHERE id > 1000 ORDER BY id LIMIT 20;
 
SELECT * FROM users WHERE name LIKE '张%';
SELECT * FROM users WHERE created_at >= '2024-01-01'
  AND created_at < '2025-01-01';
SELECT * FROM users WHERE status IN (1, 2);
 
SELECT status, COUNT(*) AS cnt FROM users GROUP BY status;
SELECT DISTINCT user_id FROM orders;

执行计划:

EXPLAIN SELECT id, name FROM users WHERE status = 1;
EXPLAIN ANALYZE SELECT ...;

详见 EXPLAIN 与运维


插入 / 更新 / 删除(DML)

INSERT INTO users (name, email, status) VALUES ('张三', 'a@b.com', 1);
INSERT INTO users (name, email) VALUES ('李四', 'c@d.com'), ('王五', 'e@f.com');
 
INSERT INTO users (id, name, email)
VALUES (1, '张三', 'a@b.com')
ON CONFLICT (id) DO UPDATE
SET name = EXCLUDED.name, updated_at = NOW();
 
UPDATE users SET status = 0 WHERE id = 1001;
UPDATE users SET name = '李四' WHERE id = 1002;
 
DELETE FROM users WHERE id = 1003;
DELETE FROM logs WHERE created_at < NOW() - INTERVAL '90 days';

UPSERT 细节:实用语法


事务

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- ROLLBACK;

MVCC 与 SAVEPOINT:MVCC 与事务


权限(简表)

CREATE ROLE app_user WITH LOGIN PASSWORD 'secret';
GRANT CONNECT ON DATABASE app_db TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

备份与恢复

# 逻辑备份
pg_dump -U postgres -d app_db -F c -f app_db.dump
 
# 恢复
pg_restore -U postgres -d app_db_restored app_db.dump
 
# 纯 SQL 文本
pg_dump -U postgres app_db > app_db.sql
psql -U postgres -d app_db_restored -f app_db.sql

常用运维 SQL

-- 表与索引
SELECT tablename FROM pg_tables WHERE schemaname = 'public';
SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'users';
 
-- 活跃连接(见 EXPLAIN与运维)
SELECT pid, usename, state, query FROM pg_stat_activity WHERE state != 'idle';
 
ANALYZE users;
VACUUM ANALYZE users;

相关