PostgreSQL教程FG189-PG核心SQL命令速查:DDL命令全参数
本文档风哥主要介绍PostgreSQL核心DDL(数据定义语言)命令的全参数详解,包括CREATE、ALTER、DROP等命令的语法和使用方法。风哥教程参考PostgreSQL官方文档SQL Commands内容,适合数据库开发人员和DBA在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL DDL命令的概念
DDL(Data Definition Language)命令是用于定义和管理数据库对象的SQL命令,包括创建、修改和删除数据库对象。PostgreSQL支持丰富的DDL命令,用于管理表、索引、视图、序列、函数等数据库对象。更多视频教程www.fgedu.net.cn
- 用于定义数据库结构
- 会自动提交事务
- 可能会锁定数据库对象
- 可以修改数据库对象的结构
- 支持丰富的选项和参数
1.2 PostgreSQL DDL命令分类
PostgreSQL DDL命令可以分为以下几类:
- 创建命令:CREATE TABLE, CREATE INDEX, CREATE VIEW等
- 修改命令:ALTER TABLE, ALTER INDEX, ALTER VIEW等
- 删除命令:DROP TABLE, DROP INDEX, DROP VIEW等
- 其他命令:TRUNCATE, COMMENT, GRANT, REVOKE等
1.3 PostgreSQL DDL命令语法
PostgreSQL DDL命令的基本语法结构:
CREATE OBJECT_TYPE object_name
[WITH (option1 = value1, option2 = value2, …)]
[USING method]
[OPTIONS (option1 = value1, option2 = value2, …)];
— ALTER命令语法
ALTER OBJECT_TYPE object_name
action1 [parameters]
[action2 [parameters]]
…;
— DROP命令语法
DROP OBJECT_TYPE [IF EXISTS] object_name
[CASCADE | RESTRICT];
Part02-生产环境规划与建议
2.1 PostgreSQL DDL命令最佳实践
PostgreSQL DDL命令最佳实践:
– 使用合适的数据类型
– 为频繁查询的列创建索引
– 合理设置约束(主键、外键、唯一约束等)
– 使用表空间分离不同类型的数据
# 索引设计最佳实践
– 只为必要的列创建索引
– 考虑复合索引的顺序
– 定期维护索引(REINDEX)
– 避免过度索引
# 视图设计最佳实践
– 只为频繁查询创建视图
– 避免在视图中使用复杂的逻辑
– 考虑使用物化视图提高性能
– 定期刷新物化视图
2.2 PostgreSQL DDL命令性能考虑
PostgreSQL DDL命令性能考虑:
– 避免创建过多的列
– 合理设置默认值
– 考虑使用UNLOGGED TABLE提高性能(但会丢失数据)
– 批量创建表时使用事务
# ALTER TABLE性能
– 避免在生产环境高峰期执行ALTER TABLE
– 对于大表,考虑使用pg_repack等工具
– 批量修改时使用事务
– 考虑使用分区表减少锁时间
# DROP TABLE性能
– 对于大表,DROP TABLE可能需要较长时间
– 考虑使用TRUNCATE TABLE先清空数据
– 注意CASCADE选项可能会影响其他对象
2.3 PostgreSQL DDL命令安全考虑
PostgreSQL DDL命令安全考虑:
- 权限控制:确保只有授权用户可以执行DDL命令
- 备份:在执行DDL命令前备份数据库
- 测试:在测试环境中测试DDL命令
- 回滚计划:制定DDL命令失败的回滚计划
- 监控:监控DDL命令的执行情况
Part03-生产环境项目实施方案
3.1 PostgreSQL CREATE命令详解
3.1.1 CREATE TABLE命令
CREATE TABLE fgedu_[IF NOT EXISTS] table_name (
column1 data_type [constraints],
column2 data_type [constraints],
…
[table_constraints]
) [WITH (storage_parameters)] [TABLESPACE fgedutbs_name];
— 示例
CREATE TABLE fgedu_IF NOT EXISTS fgedu_fgedus (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
age INT CHECK (age >= 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) WITH (
autovacuum_enabled = true,
toast_tuple_target = 128
) TABLESPACE fgedutbs;
3.1.2 CREATE INDEX命令
CREATE [UNIQUE] INDEX [IF NOT EXISTS] index_name
ON table_name [USING method] (column1 [opclass], column2 [opclass], …)
[INCLUDE (column1, column2, …)]
[WHERE condition]
[TABLESPACE fgedutbs_name];
— 示例
CREATE INDEX IF NOT EXISTS idx_fgedu_fgedus_email
ON fgedu_fgedus (email);
CREATE UNIQUE INDEX IF NOT EXISTS idx_fgedu_fgedus_name
ON fgedu_fgedus (name);
CREATE INDEX IF NOT EXISTS idx_fgedu_fgedus_age
ON fgedu_fgedus (age) WHERE age > 18;
3.1.3 CREATE VIEW命令
CREATE [OR REPLACE] [TEMP | TEMPORARY] VIEW view_name
AS query;
— 示例
CREATE OR REPLACE VIEW fgedu_active_fgedus
AS SELECT id, name, email
FROM fgedu_fgedus
WHERE active = true;
3.2 PostgreSQL ALTER命令详解
3.2.1 ALTER TABLE命令
ALTER TABLE [IF EXISTS] table_name
action1 [parameters]
[action2 [parameters]]
…;
— 示例
— 添加列
ALTER TABLE fgedu_fgedus
ADD COLUMN active BOOLEAN DEFAULT true;
— 修改列
ALTER TABLE fgedu_fgedus
ALTER COLUMN email TYPE VARCHAR(300);
— 删除列
ALTER TABLE fgedu_fgedus
DROP COLUMN IF EXISTS age;
— 添加约束
ALTER TABLE fgedu_fgedus
ADD CONSTRAINT fgedu_fgedus_email_unique UNIQUE (email);
3.2.2 ALTER INDEX命令
ALTER INDEX [IF EXISTS] index_name
action1 [parameters]
[action2 [parameters]]
…;
— 示例
— 重命名索引
ALTER INDEX idx_fgedu_fgedus_email
RENAME TO idx_fgedu_fgedus_email_new;
— 设置表空间
ALTER INDEX idx_fgedu_fgedus_email
SET TABLESPACE fgedutbs;
3.2.3 ALTER VIEW命令
ALTER VIEW [IF EXISTS] view_name
action1 [parameters]
[action2 [parameters]]
…;
— 示例
— 重命名视图
ALTER VIEW fgedu_active_fgedus
RENAME TO fgedu_active_fgedus_v2;
— 设置所有者
ALTER VIEW fgedu_active_fgedus
OWNER TO fgedu;
3.3 PostgreSQL DROP命令详解
3.3.1 DROP TABLE命令
DROP TABLE [IF EXISTS] table_name [, table_name, …]
[CASCADE | RESTRICT];
— 示例
DROP TABLE IF EXISTS fgedu_fgedus CASCADE;
3.3.2 DROP INDEX命令
DROP INDEX [IF EXISTS] index_name [, index_name, …]
[CASCADE | RESTRICT];
— 示例
DROP INDEX IF EXISTS idx_fgedu_fgedus_email;
3.3.3 DROP VIEW命令
DROP VIEW [IF EXISTS] view_name [, view_name, …]
[CASCADE | RESTRICT];
— 示例
DROP VIEW IF EXISTS fgedu_active_fgedus;
Part04-生产案例与实战讲解
4.1 PostgreSQL CREATE命令实战示例
创建一个完整的业务表结构,包括表、索引和视图。
CREATE TABLE fgedu_IF NOT EXISTS fgedu_products (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
description TEXT,
price NUMERIC(10, 2) NOT NULL CHECK (price > 0),
stock INT NOT NULL CHECK (stock >= 0),
category_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
— 创建分类表
CREATE TABLE fgedu_IF NOT EXISTS fgedu_categories (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
— 添加外键约束
ALTER TABLE fgedu_products
ADD CONSTRAINT fgedu_products_category_id_fkey
FOREIGN KEY (category_id) REFERENCES fgedu_categories (id);
— 创建索引
CREATE INDEX IF NOT EXISTS idx_fgedu_products_name
ON fgedu_products (name);
CREATE INDEX IF NOT EXISTS idx_fgedu_products_category_id
ON fgedu_products (category_id);
CREATE INDEX IF NOT EXISTS idx_fgedu_products_price
ON fgedu_products (price);
— 创建视图
CREATE OR REPLACE VIEW fgedu_product_details
AS SELECT p.id, p.name, p.description, p.price, p.stock,
c.name AS category_name
FROM fgedu_products p
LEFT JOIN fgedu_categories c ON p.category_id = c.id;
4.2 PostgreSQL ALTER命令实战示例
修改表结构,添加新列和约束。
ALTER TABLE fgedu_products
ADD COLUMN active BOOLEAN DEFAULT true,
ADD COLUMN sku VARCHAR(50) UNIQUE;
— 修改列类型
ALTER TABLE fgedu_products
ALTER COLUMN description TYPE VARCHAR(1000);
— 添加检查约束
ALTER TABLE fgedu_products
ADD CONSTRAINT fgedu_products_sku_check
CHECK (sku IS NOT NULL);
— 重命名列
ALTER TABLE fgedu_products
RENAME COLUMN stock TO inventory;
— 重命名表
ALTER TABLE fgedu_categories
RENAME TO fgedu_product_categories;
4.3 PostgreSQL DROP命令实战示例
删除不需要的数据库对象。
DROP INDEX IF EXISTS idx_fgedu_products_price;
— 删除列
ALTER TABLE fgedu_products
DROP COLUMN IF EXISTS sku;
— 删除约束
ALTER TABLE fgedu_products
DROP CONSTRAINT IF EXISTS fgedu_products_sku_check;
— 删除视图
DROP VIEW IF EXISTS fgedu_product_details;
— 删除表(级联删除相关对象)
DROP TABLE IF EXISTS fgedu_product_categories CASCADE;
DROP TABLE IF EXISTS fgedu_products;
Part05-风哥经验总结与分享
5.1 PostgreSQL DDL命令速查表
PostgreSQL DDL命令速查表:
CREATE TABLE fgedu_table_name (…);
— 修改表
ALTER TABLE table_name ADD COLUMN column_name type;
ALTER TABLE table_name ALTER COLUMN column_name type;
ALTER TABLE table_name DROP COLUMN column_name;
— 删除表
DROP TABLE table_name;
— 创建索引
CREATE INDEX index_name ON table_name (column);
CREATE UNIQUE INDEX index_name ON table_name (column);
— 删除索引
DROP INDEX index_name;
— 创建视图
CREATE VIEW view_name AS query;
— 修改视图
ALTER VIEW view_name RENAME TO new_name;
— 删除视图
DROP VIEW view_name;
— 创建序列
CREATE SEQUENCE sequence_name;
— 修改序列
ALTER SEQUENCE sequence_name RESTART WITH 1;
— 删除序列
DROP SEQUENCE sequence_name;
— 创建函数
CREATE FUNCTION function_name(parameters) RETURNS type AS $$ … $$ LANGUAGE plpgsql;
— 修改函数
ALTER FUNCTION function_name(parameters) RENAME TO new_name;
— 删除函数
DROP FUNCTION function_name(parameters);
5.2 PostgreSQL DDL命令常见问题排查
PostgreSQL DDL命令常见问题排查:
# 检查权限
$ psql -d fgedudb -U fgedu -c “CREATE TABLE fgedu_test (id INT);”
# 检查表是否已存在
$ psql -d fgedudb -U fgedu -c “SELECT * FROM pg_tables WHERE tablename = ‘test’;”
# 检查数据类型是否正确
$ psql -d fgedudb -U fgedu -c “CREATE TABLE fgedu_test (id INT, name VARCHAR(100));”
# 2. 修改表失败
# 检查列是否存在
$ psql -d fgedudb -U fgedu -c “ALTER TABLE test ADD COLUMN age INT;”
# 检查约束是否冲突
$ psql -d fgedudb -U fgedu -c “ALTER TABLE test ADD CONSTRAINT test_id_unique UNIQUE (id);”
# 3. 删除表失败
# 检查是否有依赖对象
$ psql -d fgedudb -U fgedu -c “DROP TABLE test CASCADE;”
# 检查权限
$ psql -d fgedudb -U fgedu -c “DROP TABLE test;”
5.3 PostgreSQL DDL命令优化建议
PostgreSQL DDL命令优化建议:
- 批量操作:将多个DDL命令放在一个事务中执行,减少事务开销
- 索引管理:定期维护索引,删除不需要的索引
- 表空间:合理使用表空间,将不同类型的数据放在不同的表空间
- 分区表:对于大表,使用分区表提高性能
- 约束管理:合理设置约束,避免过多的约束影响性能
- 权限控制:严格控制DDL命令的执行权限
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
