前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL 约束:确保数据完整性和一致性的关键

SQL 约束:确保数据完整性和一致性的关键

作者头像
平凡之路.
发布于 2025-04-01 00:50:32
发布于 2025-04-01 00:50:32
19200
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

SQL 约束:确保数据完整性和一致性的关键

数据库设计中,约束(Constraints) 是一种用于限制表中字段数据类型、范围、操作方式等的规则。通过约束,数据库能够保证数据的正确性、完整性和有效性,避免错误数据的插入或修改。合理的约束设计是数据库设计的核心之一,对于确保数据质量至关重要。本文将详细讲解 SQL 中的常见约束,并通过实例帮助大家理解如何在实际应用中运用这些约束。

1. SQL 约束概述

约束 是指作用于表中字段的规则,限制了存储在表中的数据。常见的 SQL 约束包括 非空约束(NOT NULL)唯一约束(UNIQUE)主键约束(PRIMARY KEY)默认约束(DEFAULT)检查约束(CHECK)外键约束(FOREIGN KEY)

通过合理使用约束,我们可以确保数据库的 数据一致性数据完整性数据有效性。让我们一一了解这些常见的约束类型。

2. 常见约束类型

约束

描述

关键字

非空约束

限制该字段的数据不能为 NULL

NOT NULL

唯一约束

保证该字段的所有数据都是唯一的,不重复

UNIQUE

主键约束

主键是一行数据的唯一标识,要求非空且唯一

PRIMARY KEY

默认约束

存储数据时,如果未指定该字段的值,则采用默认值

DEFAULT

检查约束

保证字段值满足某一条件

CHECK

外键约束

用来让两张表的数据之间建立连接,保证数据的一致性和完整性

FOREIGN KEY

2.1 非空约束(NOT NULL)

描述NOT NULL 约束用于确保字段值不能为 NULL,即该字段必须有有效的数据。

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

说明:此示例中,name 列必须填写有效的名字,不能为 NULL。这样可以确保每条记录都有一个有效的名字。

2.2 唯一约束(UNIQUE)

描述UNIQUE 约束保证该字段的数据在整个表中是唯一的,不允许重复。常用于确保数据不重复,如邮箱地址、电话号码等。

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE
);

说明:在此例中,email 列中的每个值必须唯一,这样就能保证每个邮箱地址不会重复。

2.3 主键约束(PRIMARY KEY)

描述PRIMARY KEY 约束用于标识每一行数据的唯一性,并要求该字段的值不能为 NULL,且每一行记录的主键值必须唯一。

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

说明:在这个例子中,id 列是主键,必须唯一且非空,作为每条记录的唯一标识符。

2.4 默认约束(DEFAULT)

描述DEFAULT 约束用于指定当插入数据时,如果未提供某个字段的值,则使用默认值。它帮助我们避免遗漏某些字段的值。

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    registration_date DATE DEFAULT CURRENT_DATE
);

说明:如果插入数据时没有提供 registration_date 字段的值,那么数据库将自动填入当前日期作为默认值。

2.5 检查约束(CHECK)

描述CHECK 约束用于确保字段的值符合某个条件。比如我们可以使用 CHECK 约束来限制字段值的范围或格式。

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    age INT CHECK (age >= 18)
);

说明:在这个例子中,age 字段的值必须大于或等于 18,确保用户的年龄符合合法要求。

2.6 外键约束(FOREIGN KEY)

描述FOREIGN KEY 约束用于在两张表之间建立关联,确保数据的引用完整性。外键约束保证了子表的字段值必须引用父表中一个有效的记录。

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES user_info(id)
);

说明:在此例中,orders 表中的 user_id 列引用了 user_info 表中的 id 列,确保每个订单都关联到一个有效的用户。

3. 外键约束的深度理解

3.1 外键约束的作用

外键约束在多个表之间建立了逻辑连接,确保数据的一致性。例如,在 orders 表中,user_id 外键列引用了 user_info 表的 id 列,这样每个订单都会关联到一个有效的用户。如果删除用户,则所有与该用户相关的订单也会受到影响,或者系统会根据设定的行为进行处理。

3.2 外键约束的语法
添加外键
  • 方式一:在创建表时添加外键
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE 表名 (
    字段名 数据类型,
    ...
    [CONSTRAINT 外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
);
  • 方式二:在表创建后添加外键
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE 表名
ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);
删除外键
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
3.3 外键约束的删除和更新行为

当父表(被引用表)中的记录发生删除或更新时,子表(引用表)中的外键字段将根据指定的行为作出响应。常见的外键约束行为如下:

行为

说明

NO ACTION

如果父表中的记录被删除或更新,首先检查子表中是否有引用该记录的外键,如果有,则不允许删除或更新。

RESTRICT

与 NO ACTION 一样,禁止删除或更新父表中被引用的记录。

CASCADE

如果父表中的记录被删除或更新,自动删除或更新子表中相应的记录。

SET NULL

如果父表中的记录被删除或更新,子表中的外键字段将被设置为 NULL(前提是外键字段允许为 NULL)。

SET DEFAULT

如果父表中的记录被删除或更新,子表中的外键字段将被设置为默认值。

示例:设置删除和更新时的行为
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE orders
ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES user_info(id)
ON DELETE CASCADE
ON UPDATE CASCADE;

说明:在这个例子中,设置了 CASCADE 行为。如果 user_info 表中的某个用户被删除或更新,与之关联的 orders 表中的所有订单也会自动删除或更新。

4. 实际应用示例

为了帮助大家更好地理解这些约束的应用,以下是一个完整的数据库表设计实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键,自动增长',
    name VARCHAR(50) NOT NULL UNIQUE COMMENT '姓名,不能为空且唯一',
    age INT CHECK (age > 0 AND age <= 120) COMMENT '年龄,需大于0且小于等于120',
    status CHAR(1) DEFAULT '1' COMMENT '状态,默认值为1',
    gender CHAR(1) COMMENT '性别,允许为空'
) COMMENT '用户表';

CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID,主键,自动增长',
    user_id INT,
    order_date DATE DEFAULT CURRENT_DATE COMMENT '订单日期,默认为当前日期',
    FOREIGN KEY (user_id) REFERENCES user(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);
4.1 设计说明
  1. 用户表(user):使用了非空约束、唯一约束、检查约束、默认约束等,确保了数据的准确性和有效性。
  2. 订单表(orders):通过外键约束将每个订单与用户表关联,确保每个订单都属于有效的用户。并设置了级联删除和更新,保证了数据的完整性。

5. 总结

合理使用约束是数据库设计的基础,能够有效确保数据的完整性、一致性和有效性。通过掌握常见约束类型(如非空约束、唯一约束、主键约束、默认约束、检查约束和外键约束)的使用,能够提高数据质量,避免错误数据的插入和更新。希望本文的讲解和示例可以帮助大家更好地理解 SQL 约束的应用,并能在实际项目中提高数据库设计的质量和效率。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
spark对elasticsearch增删查改
新建一个 dataframe ,插入到索引 _index/_type ,直接调用 saveToEs ,让 _id 为自己设定的 id:
机器学习和大数据挖掘
2019/07/02
2.6K0
Hadoop/Spark读写ES之性能调优
腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇
ethanzhang
2020/04/09
5.6K0
Hadoop/Spark读写ES之性能调优
腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇
腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇
ethanzhang
2018/12/10
5.4K1
腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇
Spark写入ES报错403|Forbidden问题处理
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
岳涛
2025/05/30
710
Spark写入ES报错403|Forbidden问题处理
Spark读写ES最佳实践
更换代码中公网ip为内网ip,选择maven assembly plugin进行打包,上传带依赖的jar包到EMR上,运行"ReadES"
沈小翊
2023/11/14
8190
spark加载数据到ES
在日常开发中一定会遇到,spark将计算好的数据load到es中,供后端同学查询使用。下面介绍一下spark写es的方式。 使用scala进行演示,对应的java自己google了。
若与
2021/03/02
1K0
spark加载数据到ES
腾讯云EMR&Elasticsearch中使用ES-Hadoop之Spark篇
腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇
ethanzhang
2018/12/29
8.8K0
腾讯云EMR&Elasticsearch中使用ES-Hadoop之Spark篇
ES-Spark连接ES后,ES Client节点流量打满分析
问题描述 前段时间用es-spark读取es数遇到了client节点流量打满的现象。es-spark配置的es.nodes是es的域名。由于其中一个client是master节点,然后普通查询变得特别慢,运行20多分钟后,主节点崩溃。 解决方法 临时解决方案:降低es-spark的并发,并重启主节点。 最终解决方案:设置es.nodes.wan.only为false,即不用域名访问。将es.nodes配置为client节点的IP。 原因分析 域名访问时必须配置参数es.nodes.wan.only为true
YG
2018/05/23
3.3K3
elasticsearch-spark的用法
Hadoop允许Elasticsearch在Spark中以两种方式使用:通过自2.1以来的原生RDD支持,或者通过自2.0以来的Map/Reduce桥接器。从5.0版本开始,elasticsearch-hadoop就支持Spark 2.0。目前spark支持的数据源有:
Zephery
2022/05/23
8480
elasticsearch-spark的用法
ES-Hadoop 实践
在大数据背景下,适用于不同场景下的框架、系统层出不穷,在批量数据计算上hadoop鲜有敌手,而在实时搜索领域es则是独孤求败,那如何能让数据同时结合两者优势呢?本文介绍的es-hadoop将做到这点。关于es-hadoop的使用在ethanbzhang之前的两篇文章《腾讯云EMR&Elasticsearch中使用ES-Hadoop之Spark篇》和《腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇》中已经进行了一些介绍,本文一方面是对其内容的一些补充,另一方面也是对个人实践过程的一个总结。
franyang
2019/12/03
3.5K0
ES-Hadoop 实践
spark Could not write all entries
使用 spark 将 dataFrame 储存到 elasticsearch 出现如下报错:
机器学习和大数据挖掘
2019/07/02
1.1K0
【ES三周年】ElasticSearch 简要技术总结与Spark结合使用实践
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。它是一个实时的分布式搜索和分析引擎。它可以帮助你用几秒钟内搜索百万级别的数据。
大鹅
2023/02/14
2K0
【Spark篇】---SparkSQL初始和创建DataFrame的几种方式
          Hive是Shark的前身,Shark是SparkSQL的前身,SparkSQL产生的根本原因是其完全脱离了Hive的限制。
LhWorld哥陪你聊算法
2018/09/13
2.8K0
【Spark篇】---SparkSQL初始和创建DataFrame的几种方式
Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN
本文介绍了基于Spark的SQL编程的常用概念和技术。首先介绍了Spark的基本概念和架构,然后详细讲解了Spark的数据类型和SQL函数,最后列举了一些Spark在实际应用中的例子。
片刻
2018/01/05
26.6K0
spark2的SparkSession思考与总结2:SparkSession有哪些函数及作用是什么
问题导读 1.spark SparkSession包含哪些函数? 2.创建DataFrame有哪些函数? 3.创建DataSet有哪些函数? 上一篇spark2:SparkSession思考与总
用户1410343
2018/03/26
3.8K0
使用Hive读写ElasticSearch中的数据
ElasticSearch已经可以与YARN、Hadoop、Hive、Pig、Spark、Flume等大数据技术框架整合起来使用,尤其是在添加数据的时候,可以使用分布式任务来添加索引数据,尤其是在数据平台上,很多数据存储在Hive中,使用Hive操作ElasticSearch中的数据,将极大的方便开发人员。这里记录一下Hive与ElasticSearch整合,查询和添加数据的配置使用过程。基于Hive0.13.1、Hadoop-cdh5.0、ElasticSearch 2.1.0。
Java架构师必看
2021/08/12
1.5K0
Spark SQL,DataFrame以及 Datasets 编程指南 - For 2.0
Spark SQL 是 Spark 用来处理结构化数据的一个模块。与基础的 Spark RDD API 不同,Spark SQL 提供了更多数据与要执行的计算的信息。在其实现中,会使用这些额外信息进行优化。可以使用 SQL 语句和 Dataset API 来与 Spark SQL 模块交互。无论你使用哪种语言或 API 来执行计算,都会使用相同的引擎。这让你可以选择你熟悉的语言(现支持 Scala、Java、R、Python)以及在不同场景下选择不同的方式来进行计算。
codingforfun
2018/08/24
4.2K0
Spark SQL | 目前Spark社区最活跃的组件之一
Spark SQL是一个用来处理结构化数据的Spark组件,前身是shark,但是shark过多的依赖于hive如采用hive的语法解析器、查询优化器等,制约了Spark各个组件之间的相互集成,因此Spark SQL应运而生。
大数据学习与分享
2020/08/10
2.5K0
Spark SQL | 目前Spark社区最活跃的组件之一
Note_Spark_Day08:Spark SQL(Dataset是什么、外部数据源、UDF定义和分布式SQL引擎)
​ Spark 框架从最初的数据结构RDD、到SparkSQL中针对结构化数据封装的数据结构DataFrame, 最终使用Dataset数据集进行封装,发展流程如下。
Maynor
2021/12/07
4.2K0
Note_Spark_Day08:Spark SQL(Dataset是什么、外部数据源、UDF定义和分布式SQL引擎)
Elasticsearch与Hive的数据互导
首先先下载一个叫"elasticsearch-hadoop-hive"的JAR包,放到相应路径下:https://jar-download.com/artifacts/org.elasticsearch/elasticsearch-hadoop-hive
dandelion1990
2019/06/27
6.5K2
推荐阅读
相关推荐
spark对elasticsearch增删查改
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验