【PostgreSQL】【第3章】PostgreSQL的对象操作

1. 表约束

1.1 常见约束类型
  • 主键约束 (PRIMARY KEY)
    用于唯一标识表中的每条记录。语法示例:

    sql 复制代码
    CREATE TABLE test (
      ID BIGSERIAL PRIMARY KEY,
      name VARCHAR(64) NOT NULL
    );
  • 非空约束 (NOT NULL)
    确保字段值不为空:

    sql 复制代码
    CREATE TABLE test (
      name VARCHAR(64) NOT NULL
    );
  • 唯一约束 (UNIQUE)
    确保字段值唯一:

    sql 复制代码
    CREATE TABLE test (
      id_card VARCHAR(18) UNIQUE
    );
  • 检查约束 (CHECK)
    自定义条件验证数据:

    sql 复制代码
    CREATE TABLE product (
      price NUMERIC CHECK(price > 0),
      discount_price NUMERIC CHECK(discount_price <= price)
    );
1.2 外键约束的争议
  • 外键的缺点
    可能导致级联操作风险(如误删数据)和维护复杂度高,不推荐使用

2. 表默认值

2.1 默认值设置
  • 常用场景:自动填充创建时间、更新时间等字段:

    sql 复制代码
    CREATE TABLE user (
      create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

3. 触发器

3.1 触发器实现级联删除
  • 步骤
    1. 创建学生表和分数表:

      sql 复制代码
      CREATE TABLE student (ID INT, name VARCHAR(64));
      CREATE TABLE score (student_id INT, math NUMERIC);
    2. 编写触发器函数:

      sql 复制代码
      CREATE FUNCTION delete_score() RETURNS TRIGGER AS $$
      BEGIN
        DELETE FROM score WHERE student_id = OLD.ID;
        RETURN OLD;
      END;
      $$ LANGUAGE plpgsql;
    3. 绑定触发器:

      sql 复制代码
      CREATE TRIGGER trigger_delete_student 
      AFTER DELETE ON student 
      FOR EACH ROW EXECUTE FUNCTION delete_score();

4. 表空间管理

4.1 表空间的作用
  • 核心功能:指定表的物理存储路径。

  • 创建表空间

    sql 复制代码
    CREATE TABLESPACE ts_test LOCATION '/path/to/directory';
  • 查询表存储路径

    sql 复制代码
    SELECT pg_relation_filepath('student');
4.2 表空间存储问题
  • 软链接机制 :默认路径和指定路径会同时存在符号链接,避免重复存储。

5. 视图

5.1 视图的创建与限制
  • 简单视图 (单表查询):

    sql 复制代码
    CREATE VIEW student_view AS 
    SELECT ID, name FROM student;
  • 复杂视图 (多表关联):

    sql 复制代码
    CREATE VIEW student_score AS
    SELECT s.name, sc.math 
    FROM student s 
    JOIN score sc ON s.ID = sc.student_id;
  • 限制 :复杂视图不支持写操作


6. 索引应用

6.1 索引类型与性能对比
  • B-Tree 索引 (默认):

    sql 复制代码
    CREATE INDEX idx_name ON test (name);
  • GIN 索引 (适用于数组字段):

    sql 复制代码
    CREATE INDEX idx_phones ON user USING GIN (phones);
6.2 性能测试
  • 无索引查询 :全表扫描 (Seq Scan),耗时约 0.5 秒。
  • 有索引查询 :索引扫描 (Index Scan),耗时约 0.05 秒。

7. 物化视图

7.1 物化视图特性
  • 与普通视图的区别持久化存储数据,查询效率更高。

  • 创建示例

    sql 复制代码
    CREATE MATERIALIZED VIEW mv_product AS 
    SELECT ID, name FROM product;
7.2 数据同步方式
  • 全量更新

    sql 复制代码
    REFRESH MATERIALIZED VIEW mv_product;
  • 增量更新 (需唯一索引):

    sql 复制代码
    CREATE UNIQUE INDEX idx_mv_id ON mv_product (ID);
    REFRESH MATERIALIZED VIEW CONCURRENTLY mv_product;
7.3 更新机制
  • 版本控制 :通过 xminxmax 字段追踪数据版本变化。

关键术语

  • 约束 (Constraints):用于保证数据完整性的规则。
  • 触发器 (Trigger):事件驱动的存储过程。
  • 物化视图 (Materialized View):缓存复杂查询结果的物理表。

操作提示

  • 索引优化需根据查询模式选择合适类型。
  • 物化视图的更新频率需平衡性能与数据实时性需求。
相关推荐
一加一等于二4 分钟前
docker部署postgresql17,并且安装插件
docker·postgresql
超级小忍44 分钟前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税1 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hshpy1 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
文牧之2 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
篱笆院的狗2 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存
洛神灬殇3 小时前
【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
网络·数据库·微服务·云原生·架构
小鸡脚来咯4 小时前
redis分片集群架构
数据库·redis·架构
christine-rr4 小时前
征文投稿:如何写一份实用的技术文档?——以软件配置为例
运维·前端·网络·数据库·软件构建
海尔辛5 小时前
SQL 基础入门
数据库·sql