当前位置: 首页 > news >正文

SQL约束:数据完整性的守护者

在SQL中,约束(Constraints) 是作用于数据库表字段上的规则,用于强制保证数据的完整性、准确性和一致性。当插入、更新或删除数据时,约束会自动验证操作是否符合规则,若违反则拒绝执行。

以下是SQL中常见的约束类型及其作用:


📌 1. PRIMARY KEY(主键约束)

  • 作用:唯一标识表中的每一条记录(类似身份证号)。
  • 特点
    • 唯一性:值不可重复。
    • 非空性:值不可为 NULL
    • 一个表只能有一个主键(可由单列或多列组合)。
CREATE TABLE Users (id INT PRIMARY KEY,  -- 单列主键name VARCHAR(50)
);-- 多列组合主键
CREATE TABLE Orders (order_id INT,product_id INT,PRIMARY KEY (order_id, product_id)
);

📌 2. FOREIGN KEY(外键约束)

  • 作用:确保表间数据关联的完整性(如订单必须属于存在的用户)。
  • 特点
    • 指向另一张表的主键唯一键
    • 可定义级联操作(如 ON DELETE CASCADE:主表删除时,自动删除从表关联数据)。
CREATE TABLE Orders (order_id INT PRIMARY KEY,user_id INT,-- 关联Users表的主键idFOREIGN KEY (user_id) REFERENCES Users(id)ON DELETE CASCADE  -- 用户删除时,其订单自动删除
);

📌 3. UNIQUE(唯一约束)

  • 作用:确保字段值在表内唯一(允许空值)。
  • 特点
    • 一个表可有多个唯一约束。
    • 与主键区别:允许 NULL(主键不允许)。
CREATE TABLE Employees (id INT PRIMARY KEY,email VARCHAR(100) UNIQUE  -- 邮箱必须唯一
);

📌 4. NOT NULL(非空约束)

  • 作用:强制字段不允许存入 NULL 值(必须提供有效数据)。
  • 常见场景:关键字段如姓名、订单号等。
CREATE TABLE Products (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL  -- 产品名不能为空
);

📌 5. CHECK(检查约束)

  • 作用:自定义条件校验字段值(如年龄范围、数值正负)。
CREATE TABLE Students (id INT PRIMARY KEY,age INT CHECK (age >= 18),  -- 年龄必须≥18grade CHAR(1) CHECK (grade IN ('A','B','C'))  -- 等级只能是A,B,C
);

📌 6. DEFAULT(默认值约束)

  • 作用:当插入数据未指定字段值时,自动填充预设值。
CREATE TABLE Orders (id INT PRIMARY KEY,order_date DATE DEFAULT CURRENT_DATE  -- 未指定日期时自动用当前日期
);

⚠️ 约束的注意事项

  1. 命名约束:显式命名便于维护(否则数据库自动生成随机名)。
    CREATE TABLE Users (id INT,CONSTRAINT pk_users PRIMARY KEY (id)  -- 命名主键约束
    );
    
  2. 修改约束:可通过 ALTER TABLE 增删约束。
    ALTER TABLE Employees ADD CONSTRAINT chk_salary CHECK (salary > 0);
    ALTER TABLE Employees DROP CONSTRAINT chk_salary;
    
  3. 性能影响:外键和唯一约束会自动创建索引,可能影响写入速度,但提升查询效率。

💡 应用场景示例

约束类型实际应用场景
PRIMARY KEY用户ID、订单号等唯一标识字段
FOREIGN KEY订单关联用户ID、评论关联文章ID
UNIQUE用户邮箱、手机号等不可重复的业务字段
NOT NULL必填项(如用户名、创建时间)
CHECK价格≥0、性别只能是’M’或’F’等逻辑校验
DEFAULT自动填充创建时间、状态默认值

合理使用约束可避免脏数据(如无效外键、重复订单号),是数据库设计的核心环节!

http://www.dtcms.com/a/324302.html

相关文章:

  • Linux中rsync数据镜像工具的解析与应用实战
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 MySQL 服务器
  • JavaScript防抖与节流:拯救你的网页卡顿危机!
  • GitHub 趋势日报 (2025年08月09日)
  • 通过Certbot自动申请更新HTTPS网站的SSL证书
  • vue中使用h5plus
  • 一些js数组去重的实现算法
  • 黑马SpringBoot+Elasticsearch作业2实战:商品搜索与竞价排名功能实现
  • 使用正则表达式检测Base64字符串并提取图片类型及正文的JavaScript函数,代码精简且高效
  • 250810-OpenWebUI集成Dify应用
  • 《设计模式》策略模式
  • STM32的计数模式和pwm模式
  • 亚麻云之数据安家——RDS数据库服务入门
  • sqli-labs-master/Less-62~Less-65
  • 01.【面试题】在SpringBoot中如何实现多数据源配置
  • (Python)爬虫进阶(Python爬虫教程)(CSS选择器)
  • 2025年全国青少年信息素养大赛Scratch编程践挑战赛-小低组-初赛-模拟题
  • Linux系统编程Day11 -- 进程状态的优先级和特性
  • 移动端音频处理实践:59MB变声应用的技术实现分析
  • 机器学习-增加样本、精确率与召回率
  • LeetCode 869.重新排序得到 2 的幂:哈希表+排序(一次初始化)
  • Android 16 KB页面大小适配的权威技术方案总结
  • Android快速视频解码抽帧FFmpegMediaMetadataRetriever,Kotlin(2)
  • Android 开发问题:Invalid id; ID definitions must be of the form @+id/ name
  • 010601抓包工具及证书安装-基础入门-网络安全
  • 浅谈 A2A SDK 核心组件
  • 电脑本地摄像头做成rtsp流调用测试windows系统中
  • 【Docker实战】将Django应用容器化的完整指南
  • Pytorch深度学习框架实战教程-番外篇10-PyTorch中的nn.Linear详解
  • Linux-静态配置ip地址