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
– 关键字使用大写
– 对象名使用小写,并用下划线分隔
– 每行只写一个子句
– 使用适当的缩进提高可读性
– 字符串使用单引号
SELECT
fgedu_id,
fgeduname,
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扩展名
# 切换到postgres用户
$ su – pgsql # 登录PostgreSQL
$ psql
# 查看数据库列表
postgres=# \l
# 查看表列表
postgres=# \dt
# 连接到指定数据库
postgres=# \c fgedudb
# 查看表结构
fgedudb=# \d fgedu_fgedus
# 退出psql
fgedudb=# \q
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 命名规范实战示例
创建符合命名规范的数据库对象。
$ 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命令管理数据库。
$ 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. 不使用模式:合理使用模式组织数据库对象,避免命名冲突。
本文介绍了PostgreSQL的学习与使用通用约定,包括语法规范、命令使用约定和命名规范,并通过实战示例演示了如何创建符合规范的数据库对象。通过遵循这些约定,可以提高数据库的可维护性和团队协作效率。更多视频教程www.fgedu.net.cn
from PostgreSQL:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
