1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG003-PG学习与使用通用约定:语法/命令/命名规范

本文详细介绍PostgreSQL的学习与使用通用约定,包括语法规范、命令使用约定和命名规范,帮助读者养成良好的PostgreSQL使用习惯。风哥教程参考PostgreSQL官方文档Conventions等内容。

本文档风哥主要介绍PG学习与使用通用约定:语法/命令/命名规范相关内容。风哥教程参考PostgreSQL官方文档SQL Syntax, Conventions内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

本文档介绍PostgreSQL学习和使用中的通用约定,包括SQL语法规范、命令行约定、命名规范等内容,帮助初学者建立正确的编码习惯。风哥教程参考PostgreSQL官方文档SQL Syntax, Conventions内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与语法约定

1.1 SQL语法规范

PostgreSQL遵循SQL标准,但也有一些自己的扩展语法。以下是通用的SQL语法约定:

from oracle:www.itpux.com

– 关键字使用大写

– 对象名使用小写,并用下划线分隔

– 每行只写一个子句

– 使用适当的缩进提高可读性

– 字符串使用单引号

— 良好的SQL语法示例
SELECT
fgedu_id,
fgeduname,
email
FROM
fgedu_fgedus
WHERE
created_at > ‘2026-01-01′
ORDER BY
created_at DESC;

— 不良的SQL语法示例
select fgedu_id,fgeduname,email from fgedu_fgedus where created_at>’2026-01-01’ order by created_at desc;

1.2 命令使用约定

PostgreSQL命令使用约定包括:

– psql命令使用小写,如\l, \d, \c等

– 操作系统命令使用相应的命令规范

– 脚本文件使用.sh或.sql扩展名

– 配置文件使用.conf扩展名

# psql常用命令示例
# 切换到postgres用户
$ su – pgsql # 登录PostgreSQL
$ psql

# 查看数据库列表
postgres=# \l

# 查看表列表
postgres=# \dt

# 连接到指定数据库
postgres=# \c fgedudb

# 查看表结构
fgedudb=# \d fgedu_fgedus

# 退出psql
fgedudb=# \q

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在编写SQL语句时,遵循一致的语法规范可以提高代码的可读性和可维护性,学习交流加群风哥微信: itpux-com

Part02-命名规范

2.1 数据库对象命名

PostgreSQL数据库对象命名规范包括:

– 数据库名:使用小写,不超过31个字符

– 表名:使用小写,用下划线分隔,如fgedu_fgedus

– 列名:使用小写,用下划线分隔,如fgedu_id

– 索引名:使用idx_前缀,如idx_fgedu_fgedus_email

– 约束名:使用con_前缀,如con_fgedu_fgedus_pkey

– 视图名:使用v_前缀,如v_fgedu_active_fgedus

– 函数名:使用f_前缀,如f_get_fgedu_info

2.2 变量与函数命名

– 变量名:使用小写,用下划线分隔,如fgedu_count

– 函数参数:使用小写,用下划线分隔,如p_fgedu_id

– 临时变量:使用tmp_前缀,如tmp_fgedu_list

风哥提示:一致的命名规范可以帮助团队成员快速理解数据库结构和代码逻辑。

Part03-生产环境规划与建议

3.1 模式设计规范

在PostgreSQL中,模式(Schema)用于组织数据库对象。生产环境中的模式设计建议:

– 使用与业务相关的模式名,如public, fgapp, admin等

更多学习教程公众号风哥教程itpux_com

– 避免在public模式中创建所有对象

– 为不同的应用或部门创建独立的模式

– 合理设置模式的权限

— 创建模式示例
CREATE SCHEMA IF NOT EXISTS fgfgapp;
CREATE SCHEMA IF NOT EXISTS admin;
CREATE SCHEMA IF NOT EXISTS analytics;

— 在模式中创建表
CREATE TABLE fgedu_fgapp.fgedu_fgedus (
fgedu_id SERIAL PRIMARY KEY,
fgeduname VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE
);

— 查看模式中的表
\dt fgfgapp.*

3.2 表设计规范

生产环境中的表设计建议:

– 为每个表创建主键

– 使用适当的数据类型

– 添加必要的约束(NOT NULL, UNIQUE, CHECK等)

– 使用外键维护数据完整性

– 添加注释说明表和列的用途

— 创建表的良好示例
CREATE TABLE fgedu_fgapp.fgedu_orders (
order_id SERIAL PRIMARY KEY,
fgedu_id INTEGER NOT NULL REFERENCES fgfgapp.fgedu_fgedus(fgedu_id),
order_date TIMESTAMP DEFAULT NOW(),
total_amount DECIMAL(10,2) NOT NULL CHECK (total_amount > 0),
status VARCHAR(20) NOT NULL DEFAULT ‘pending’
);

— 添加表注释
COMMENT ON TABLE fgfgapp.fgedu_orders IS ‘订单表’;

— 添加列注释
COMMENT ON COLUMN fgfgapp.fgedu_orders.order_id IS ‘订单ID’;
COMMENT ON COLUMN fgfgapp.fgedu_orders.fgedu_id IS ‘用户ID’;
COMMENT ON COLUMN fgfgapp.fgedu_orders.total_amount IS ‘订单总金额’;

Part04-实战操作与示例

4.1 命名规范实战示例

创建符合命名规范的数据库对象。

# 切换到postgres用户
$ su – pgsql # 连接到fgedudb数据库
$ psql -d fgedudb

— 创建模式
fgedudb=# CREATE SCHEMA IF NOT EXISTS fgfgapp;
CREATE SCHEMA

— 创建用户表
fgedudb=# CREATE TABLE fgedu_fgapp.fgedu_fgedus (
fgedudb(# fgedu_id SERIAL PRIMARY KEY,
fgedudb(# fgeduname VARCHAR(50) NOT NULL UNIQUE,
fgedudb(# email VARCHAR(100) NOT NULL UNIQUE,
fgedudb(# password_hash VARCHAR(255) NOT NULL,
fgedudb(# first_name VARCHAR(50),
fgedudb(# last_name VARCHAR(50),
fgedudb(# created_at TIMESTAMP DEFAULT NOW(),
fgedudb(# updated_at TIMESTAMP DEFAULT NOW()
fgedudb(# );
CREATE TABLE fgedu_– 创建产品表
fgedudb=# CREATE TABLE fgedu_fgapp.fgedu_products (
fgedudb(# product_id SERIAL PRIMARY KEY,
fgedudb(# product_name VARCHAR(100) NOT NULL,
fgedudb(# description TEXT,
fgedudb(# price DECIMAL(10,2) NOT NULL CHECK (price > 0),
fgedudb(# stock_quantity INTEGER NOT NULL DEFAULT 0 CHECK (stock_quantity >= 0),
fgedudb(# created_at TIMESTAMP DEFAULT NOW(),
fgedudb(# updated_at TIMESTAMP DEFAULT NOW()
fgedudb(# );
CREATE TABLE fgedu_– 创建订单表,包含外键约束
fgedudb=# CREATE TABLE fgedu_fgapp.fgedu_orders (
fgedudb(# order_id SERIAL PRIMARY KEY,
fgedudb(# fgedu_id INTEGER NOT NULL REFERENCES fgfgapp.fgedu_fgedus(fgedu_id),
fgedudb(# order_date TIMESTAMP DEFAULT NOW(),
fgedudb(# total_amount DECIMAL(10,2) NOT NULL CHECK (total_amount > 0),
fgedudb(# status VARCHAR(20) NOT NULL DEFAULT ‘pending’,
fgedudb(# shipping_address TEXT NOT NULL,
fgedudb(# created_at TIMESTAMP DEFAULT NOW(),
fgedudb(# updated_at TIMESTAMP DEFAULT NOW()
fgedudb(# );
CREATE TABLE fgedu_– 创建订单项目表
fgedudb=# CREATE TABLE fgedu_fgapp.fgedu_order_items (
fgedudb(# order_item_id SERIAL PRIMARY KEY,
fgedudb(# order_id INTEGER NOT NULL REFERENCES fgfgapp.fgedu_orders(order_id),
fgedudb(# product_id INTEGER NOT NULL REFERENCES fgfgapp.fgedu_products(product_id),
fgedudb(# quantity INTEGER NOT NULL CHECK (quantity > 0),
fgedudb(# unit_price DECIMAL(10,2) NOT NULL CHECK (unit_price > 0),
fgedudb(# subtotal DECIMAL(10,2) NOT NULL CHECK (subtotal > 0)
fgedudb(# );
CREATE TABLE fgedu_– 创建索引
fgedudb=# CREATE INDEX idx_fgedu_fgedus_email ON fgfgapp.fgedu_fgedus(email);
fgedudb=# CREATE INDEX idx_fgedu_orders_fgedu_id ON fgfgapp.fgedu_orders(fgedu_id);
fgedudb=# CREATE INDEX idx_fgedu_orders_status ON fgfgapp.fgedu_orders(status);
fgedudb=# CREATE INDEX idx_fgedu_order_items_order_id ON fgfgapp.fgedu_order_items(order_id);
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX

— 查看创建的表
fgedudb=# \dt fgfgapp.*
List of relations
Schema | Name | Type | Owner | Size | Description
——–+———————+——-+———+————+————-
fgapp | fgedu_order_items | table | pgsql | 0 bytes |
fgapp | fgedu_orders | table | pgsql | 0 bytes |
fgapp | fgedu_products | table | pgsql | 0 bytes |
fgapp | fgedu_fgedus | table | pgsql | 0 bytes |
(4 rows)

— 查看索引
fgedudb=# \di fgfgapp.*
List of relations
Schema | Name | Type | Owner | Table | Size | Description
——–+——————————+——-+———+——————-+———+————-
fgapp | fgedu_order_items_pkey | index | pgsql | fgedu_order_items | 16 kB |
fgapp | fgedu_orders_pkey | index | pgsql | fgedu_orders | 16 kB |
fgapp | fgedu_products_pkey | index | pgsql | fgedu_products | 16 kB |
fgapp | fgedu_fgedus_email_key | index | pgsql | fgedu_fgedus | 16 kB |
fgapp | fgedu_fgedus_pkey | index | pgsql | fgedu_fgedus | 16 kB |
fgapp | fgedu_fgedus_fgeduname_key | index | pgsql | fgedu_fgedus | 16 kB |
fgapp | idx_fgedu_order_items_order_id | index | pgsql | fgedu_order_items | 16 kB |
fgapp | idx_fgedu_orders_status | index | pgsql | fgedu_orders | 16 kB |
fgapp | idx_fgedu_orders_fgedu_id | index | pgsql | fgedu_orders | 16 kB |
fgapp | idx_fgedu_fgedus_email | index | pgsql | fgedu_fgedus | 16 kB |
(10 rows)

4.2 命令使用示例

使用psql命令管理数据库。

# 切换到postgres用户
$ su – pgsql # 查看所有数据库
$ psql -l
List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges
———–+———-+———-+———+———+———————–
fgedudb | pgsql | UTF8 | C.UTF-8 | C.UTF-8 |
pgsql | pgsql | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql template1 | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql (4 rows)

# 连接到fgedudb数据库
$ psql -d fgedudb

# 查看模式
fgedudb=# \dn
List of schemas
Name | Owner
——–+———-
fgapp | pgsql public | pgsql (2 rows)

# 查看表结构
fgedudb=# \d fgfgapp.fgedu_fgedus
Table “fgfgapp.fgedu_fgedus”
Column | Type | Collation | Nullable | Default
—————+—————————–+———–+———-+——————————————-
fgedu_id | integer | | not null | nextval(‘fgfgapp.fgedu_fgedus_fgedu_id_seq’::regclass)
fgeduname | character varying(50) | | not null |
email | character varying(100) | | not null |
password_hash | character varying(255) | | not null |
first_name | character varying(50) | | |
last_name | character varying(50) | | |
created_at | timestamp without time zone | | | now()
updated_at | timestamp without time zone | | | now()
Indexes:
“fgedu_fgedus_pkey” PRIMARY KEY, btree (fgedu_id)
“fgedu_fgedus_email_key” UNIQUE CONSTRAINT, btree (email)
“fgedu_fgedus_fgeduname_key” UNIQUE CONSTRAINT, btree (fgeduname)
“idx_fgedu_fgedus_email” btree (email)

# 查看约束
fgedudb=# \d fgfgapp.fgedu_orders
Table “fgfgapp.fgedu_orders”
Column | Type | Collation | Nullable | Default
—————-+—————————–+———–+———-+——————————————-
order_id | integer | | not null | nextval(‘fgfgapp.fgedu_orders_order_id_seq’::regclass)
fgedu_id | integer | | not null |
order_date | timestamp without time zone | | | now()
total_amount | numeric(10,2) | | not null |
status | character varying(20) | | not null | ‘pending’
shipping_address | text | | not null |
created_at | timestamp without time zone | | | now()
updated_at | timestamp without time zone | | | now()
Indexes:
“fgedu_orders_pkey” PRIMARY KEY, btree (order_id)
“idx_fgedu_orders_status” btree (status)
“idx_fgedu_orders_fgedu_id” btree (fgedu_id)
Check constraints:
“fgedu_orders_total_amount_check” CHECK (total_amount > 0::numeric)
Foreign-key constraints:
“fgedu_orders_fgedu_id_fkey” FOREIGN KEY (fgedu_id) REFERENCES fgfgapp.fgedu_fgedus(fgedu_id)

# 退出psql
fgedudb=# \q

Part05-风哥经验总结与分享

5.1 最佳实践建议

1. 一致性:在整个项目中保持一致的命名和语法规范。

2. 可读性:编写易于理解的SQL语句和命令。

3. 文档化:为数据库对象添加适当的注释。

4. 版本控制:将数据库脚本纳入版本控制。

5. 安全性:遵循最小权限原则,合理设置用户权限。

5.2 常见错误与规避

1. 使用保留字作为对象名:避免使用PostgreSQL保留字作为表名、列名等。

2. 不规范的命名:避免使用大小写混合或无意义的命名。

3. 缺少约束:确保为表添加必要的约束,维护数据完整性。

4. 不使用模式:合理使用模式组织数据库对象,避免命名冲突。

风哥教程针对风哥教程针对风哥教程针对生产环境建议:制定并严格遵循数据库命名和语法规范是团队协作的基础,可以大幅提高开发效率和代码质量。学习交流加群风哥QQ113257174

本文介绍了PostgreSQL的学习与使用通用约定,包括语法规范、命令使用约定和命名规范,并通过实战示例演示了如何创建符合规范的数据库对象。通过遵循这些约定,可以提高数据库的可维护性和团队协作效率。更多视频教程www.fgedu.net.cn

from PostgreSQL:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息