【PostgreSQL】提高篇——深入讨论约束(如 NOT NULL、CHECK、FOREIGN KEY)的使用及其对数据完整性的影响

embedded/2024/10/10 15:13:19/

数据库设计中,数据完整性是确保数据准确性和可靠性的重要方面。约束(Constraints)是实现数据完整性的关键机制。

通过约束,数据库管理系统可以强制执行特定的规则,以确保数据的有效性和一致性。常见的约束包括 NOT NULLCHECK 和 FOREIGN KEY。这些约束在实际应用中具有重要意义,尤其是在需要保证数据质量和业务规则的场景中。

一、背景与重要性

  1. 数据完整性:约束确保数据库中的数据符合特定规则,从而防止无效数据的插入。例如,电子商务系统中的订单表需要确保每个订单都有有效的客户ID。

  2. 业务规则实施:约束可以直接在数据库层面实施业务逻辑,减少应用程序中对数据验证的需求。例如,学生成绩表可以通过CHECK约束确保成绩在0到100之间。

  3. 减少错误:通过使用约束,可以在数据插入或更新时自动检测错误,避免了后续的手动检查和数据清理工作。

  4. 提高性能:约束可以帮助数据库优化查询和更新操作,因为数据库系统可以利用这些规则来提高执行效率。

二、常见约束及其使用

1. NOT NULL 约束

定义:NOT NULL 约束确保某个列不能有NULL值,强制要求该列必须包含有效数据。

示例:创建一个用户表,确保用户名和邮箱不能为空。

CREATE TABLE users (user_id SERIAL PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL
);

解释

  • user_id SERIAL PRIMARY KEY:定义用户ID为主键,自动生成唯一值。
  • username VARCHAR(50) NOT NULL:用户名列不能为NULL,必须提供值。
  • email VARCHAR(100) NOT NULL:邮箱列同样不能为NULL。

影响

  • 如果尝试插入没有用户名或邮箱的记录,将会引发错误。例如:
INSERT INTO users (username) VALUES (NULL); -- 会失败
2. CHECK 约束

定义:CHECK 约束用于限制列中的值,确保其符合特定条件。

示例:创建一个学生成绩表,确保成绩在0到100之间。

CREATE TABLE grades (student_id SERIAL PRIMARY KEY,subject VARCHAR(50) NOT NULL,score INT CHECK (score >= 0 AND score <= 100)
);

解释

  • student_id SERIAL PRIMARY KEY:定义学生ID为主键。
  • subject VARCHAR(50) NOT NULL:学科列不能为NULL。
  • score INT CHECK (score >= 0 AND score <= 100):成绩列必须在0到100之间。

影响

  • 如果尝试插入不符合条件的成绩,将会引发错误。例如:
INSERT INTO grades (subject, score) VALUES ('Math', 110); -- 会失败
3. FOREIGN KEY 约束

定义:FOREIGN KEY 约束用于确保在一个表中的值在另一个表中存在,维护表之间的关系。

示例:创建一个订单表,确保每个订单都关联到有效的用户。

CREATE TABLE orders (order_id SERIAL PRIMARY KEY,user_id INT,order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(user_id)
);

解释

  • order_id SERIAL PRIMARY KEY:定义订单ID为主键。
  • user_id INT:用户ID列,存储关联用户的ID。
  • FOREIGN KEY (user_id) REFERENCES users(user_id):确保每个订单的用户ID在用户表中存在。

影响

  • 如果尝试插入一个不存在的用户ID,将会引发错误。例如:
INSERT INTO orders (user_id) VALUES (999); -- 如果999不存在于users表中,会失败

三、约束的实际应用场景

  1. 电子商务系统
       - 在电子商务系统中,用户表和订单表之间的外键约束确保每个订单都与有效的用户相关联,避免孤立订单的产生。

  2. 教育管理系统
       - 在教育管理系统中,学生表和成绩表之间的外键约束确保每个成绩都与有效的学生记录相关联,同时CHECK约束确保成绩在合理范围内。

  3. 财务系统
       - 在财务系统中,交易表可以使用CHECK约束确保交易金额为正数,同时外键约束确保交易与有效账户相关联。

四、总结

约束在数据库设计中起着至关重要的作用。通过使用 NOT NULLCHECK 和 FOREIGN KEY 约束,可以有效地维护数据完整性、实施业务规则、减少错误和提高性能。

了解这些约束的使用和影响,可以帮助开发者设计出更健壮和可靠的数据库系统。


http://www.ppmy.cn/embedded/125444.html

相关文章

不用工具,利用linux的ssh命令远程执行命令

不用批量运维工具时&#xff0c;如何用ssh命令远程执行命令&#xff0c;执行和采集信息&#xff1f; 1、当可以免密登录服务器时&#xff1a;采用linux自带的ssh命令。 root ssh -o BatchModeyes -o StrictHostKeyCheckingno root172.0.0.19 "hostname" 通过SSH连…

CANoe_DBC_ValueTable格式报错_syntax error

1、使用CANoe的CANdb打开文件报错截图如下&#xff1a; 2、问题原因&#xff0c;由于DBC中的ValueTable可能用自动化生成工具&#xff0c;缺少了值“5”的填充 3、可能原因推测&#xff1a;Excel中的数据未完整填充 Excel数据输入遗漏&#xff1a; 在准备用于自动化生成工具的E…

springmvc发送邮件的功能怎么集成Spring?

springmvc发送邮件的实现方法&#xff1f;怎么用SpringMVC发信&#xff1f; Spring框架提供了强大的支持&#xff0c;使得在SpringMVC应用中集成邮件发送功能变得非常简单。AokSend将详细介绍如何在SpringMVC应用中集成邮件发送功能&#xff0c;并确保其高效、可靠地运行。 s…

k8s的pod管理及优化

资源管理介绍 资源管理方式 命令式对象管理&#xff1a;直接用命令去操作kubernetes资源 命令式对象配置&#xff1a;通过命令配置和配置文件去操作kubernets资源 声明式对象配置&#xff1a;通过apply命令和配置文件去操作kubernets资源 命令式对象管理&#xff1a; 资源类…

在aarch64上编译,fstack: master分支:5b97230c858598a10e1b82c tag: v1.23, origin/master

F-Stack一个基于DPDK的开源和高性能网络框架 基于DPDK23.11需要做如下操作 sed替换&#xff1a; sed -n /DEV_RX_OFFLOAD_IPV4_CKSUM/p drivers/net/macb/* sed -i s/ETH_/RTE_ETH_/g *.c sed -i s/DEV_/RTE_ETH_/g *.c f-stack适配dpdk20.11 sed -i s/RTE_MBUF_F_RX_IP_C…

资源《Arduino 扩展板4-单游戏摇杆》说明。

资源链接&#xff1a; Arduino 扩展板4-单游戏摇杆 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件…

QT实现QMessageBox中文按钮

这是我记录Qt学习过程心得文章的第二篇&#xff0c;主要是为了方便QMessageBox弹出框的使用&#xff0c;通过自定义的方式&#xff0c;将其常用的功能&#xff0c;统一封装成一个函数&#xff0c;还是写在了Skysonya类里面。 实现代码&#xff1a; //中文提示对话框 bool Sky…

12.数据结构和算法-栈和队列的定义和特点

栈和队列的定义和特点 栈的应用 队列的常见应用 栈的定义和特点 栈的相关概念 栈的示意图 栈与一般线性表有什么不同 队列的定义和特点 队列的相关概念