PostgreSQL 中约束Constraints

在 PostgreSQL 中,约束(Constraints)是用于限制进入数据库表中数据的规则。它们确保数据的准确性和可靠性,通过定义规则来防止无效数据的插入或更新。PostgreSQL 支持多种类型的约束,每种约束都有特定的用途和语法。以下是主要的约束类型及其简要说明:

  1. PRIMARY KEY(主键约束):

    • 确保表中每一行的唯一标识。
    • 主键列的值必须唯一且不能为空(NOT NULL)。
    • 一个表只能有一个主键,但主键可以包含多个列(复合主键)。
    sql 复制代码
    CREATE TABLE students (
        student_id SERIAL PRIMARY KEY,
        name VARCHAR(100) NOT NULL
    );
  2. FOREIGN KEY(外键约束):

    • 确保在一个表中的值在另一个表的主键或唯一键中存在。
    • 用于维护表之间的参照完整性。
    sql 复制代码
    CREATE TABLE enrollments (
        enrollment_id SERIAL PRIMARY KEY,
        student_id INT,
        course_id INT,
        FOREIGN KEY (student_id) REFERENCES students(student_id),
        FOREIGN KEY (course_id) REFERENCES courses(course_id)
    );
  3. UNIQUE(唯一约束):

    • 确保列中的所有值都是唯一的。
    • 允许空值(NULL),但多个空值不违反唯一性。
    sql 复制代码
    CREATE TABLE students (
        student_id SERIAL PRIMARY KEY,
        email VARCHAR(100) UNIQUE
    );
  4. CHECK(检查约束):

    • 确保列中的值满足指定的条件。
    • 可以在列级别或表级别定义。
    sql 复制代码
    CREATE TABLE students (
        student_id SERIAL PRIMARY KEY,
        age INT CHECK (age >= 0 AND age <= 120)
    );
  5. NOT NULL(非空约束):

    • 确保列中的值不能为空。
    • 可以在列定义时直接指定。
    sql 复制代码
    CREATE TABLE students (
        student_id SERIAL PRIMARY KEY,
        name VARCHAR(100) NOT NULL
    );
  6. EXCLUDE(排除约束):

    • 确保使用指定的运算符(如等于、不等于、小于、大于等)的列组合中的值不会冲突。
    • 通常用于确保地理数据(如经纬度)不会重叠。
    sql 复制代码
    CREATE TABLE circles (
        circle_id SERIAL PRIMARY KEY,
        center POINT,
        radius DOUBLE PRECISION,
        EXCLUDE USING GIST (circle_with_radius WITH =, circle_with_center WITH &&)
    ) WHERE (radius > 0);

    在上面的例子中,circle_with_radius 和 circle_with_center 是使用表达式索引定义的虚拟列,用于确保没有两个圆重叠。

  7. DEFAULT(默认值约束):

    • 为列指定默认值,当插入数据时没有为该列提供值时,将使用默认值。
    sql 复制代码
    CREATE TABLE students (
        student_id SERIAL PRIMARY KEY,
        enrollment_date DATE DEFAULT CURRENT_DATE
    );

通过合理地使用这些约束,可以确保数据库中的数据保持一致性、准确性和完整性。在定义表结构时,应该根据业务需求选择适当的约束来限制数据输入。

相关推荐
阳光九叶草LXGZXJ6 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
字节渡客7 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
OnlineProxy9 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
辻弋20110 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_11 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼11 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川12 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路12 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna13 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白13 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库