SQL-约束篇

news2024/9/21 10:51:46

        在数据库设计中,约束是确保数据完整性和准确性的关键元素。约束可以限制表中数据的类型、范围和关系,从而维护数据的一致性和可靠性。

1. 主键约束 (Primary Key)

        主键约束用于唯一标识表中的每一行数据。一个表只能有一个主键,主键字段的值必须唯一且不能为空。

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 '年龄',
    status CHAR(1) NOT NULL DEFAULT '1' COMMENT '状态',
    gender CHAR(1) NOT NULL COMMENT '性别'
) COMMENT '用户表';


insert into user(name,age,status,gender) values('Tomm',25,'1','男'),('Jerry',30,'0','女'),('Lily',20,'1','女');

在上述代码中,id字段被定义为主键,并且使用AUTO_INCREMENT自动生成唯一值。

效果展示:

可以看到我们并没有插入id,他是自己填充的,id旁边的黄色小钥匙代表是主键

63393947f10c44c1a40dac0ff7e3f784.png

2. 唯一约束 (Unique)

唯一约束确保某个字段的值在表中是唯一的。与主键不同,表中可以有多个唯一约束。

name VARCHAR(50) NOT NULL UNIQUE COMMENT '姓名'

在用户表中,name字段被设置为唯一,这意味着不同用户的姓名不能重复。

3. 索引约束 (Index)

索引约束用于加速查询操作。通过在一个或多个列上创建索引,可以提高检索数据的速度。

CREATE INDEX idx_name ON user(name);

这条语句在user表的name字段上创建了一个索引。

4. 非空约束 (Not Null)

非空约束确保某个字段在插入数据时不能为空。

status CHAR(1) NOT NULL DEFAULT '1' COMMENT '状态'

在用户表中,status字段被定义为非空,并且有默认值为1

5. 默认约束 (Default)

默认约束用于为某个字段指定默认值,当插入数据时未提供该字段的值时,将使用默认值。

status CHAR(1) NOT NULL DEFAULT '1' COMMENT '状态'

如果插入用户数据时没有指定status,则默认值为1

6. 检查约束 (Check)

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

age INT CHECK (age > 0 AND age < 120) COMMENT '年龄'

在用户表中,age字段的值必须在0到120之间。

7. 外键约束 (Foreign Key)

        外键约束用于在两张表之间建立联系,确保数据的一致性。外键字段的值必须在被引用的表中存在。

INSERT INTO user(name, age, status, gender) VALUES
('Tomm', 25, '1', '男'),
('Jerry', 30, '0', '女'),
('Lily', 20, '1', '女');

INSERT INTO dept (id, name) VALUES
(1, '研发部'),
(2, '市场部'),
(3, '财务部'),
(4, '销售部'),
(5, '总经办');

INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id) VALUES
(1, '金席', 66, '总裁', 20000, '2000-01-01', NULL, 5),
(2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1),
(3, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1),
(4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1),
(5, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1),
(6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1);

        实现外键约束

        在员工表中,dept_id字段作为外键引用了部门表的id字段,确保每个员工都属于一个有效的部门。现在创建了两张表,员工表和部门表,但并没有实现外键约束,我们需要通过下面代码实现外键约束。

ALTER TABLE emp ADD CONSTRAINT fk_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON DELETE CASCADE ON UPDATE CASCADE;

效果展示:

部门表

56ed9adc84854e268ce1102e16877ab0.png

员工表:

实现外键约束后他会多出一列,dept_id ,蓝色小钥匙就代表外键

824560f131744e77b2169dee692a6791.png 

         删除外键约束

-- 删除外键
alter table emp drop foreign key fk_dept_id;

        外键约束 删除/更新 行为约束

        restrictno action 是默认的,他们两个的效果是一样的,如果不设置行为,就会默认是他们两,删除父表中的关联部分,会报错,因为有外键的约束

  • CASCADE:级联删除或更新。
  • RESTRICT:限制删除或更新。
  • NO ACTION:无操作。
  • SET NULL:设置为NULL。
  • SET DEFAULT:设置为默认值。

        设置行为的话,只需要向下面代码一样,在最后面加上 on delete cascade on update cascade;  当然 cascade 可以替换其他行为

-- 指定外键约束 删除/更新 行为
    -- cascade: 级联删除/更新
    -- restrict: 限制删除/更新
    -- no action: 无操作
    -- set null: 设置为null
    -- set default: 设置为默认值

alter table emp add constraint fk_dept_id foreign key (dept_id) references dept(id) on delete cascade on update cascade;

 6b3f20387c41470d913ed8ca5bce3bcb.png

总结

        SQL约束是数据库设计中不可或缺的一部分,通过合理使用各种约束,可以确保数据的完整性和一致性。在实际应用中,开发者应根据需求灵活运用这些约束,以提高数据管理的效率和安全性。

      上篇写的是SQL中的函数,感兴趣的可以去看看哦~

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot-VUE-python-nodeJS铁路列车安全管理-评估报告-铁路局-客运-货运-行车-站段-天气情况

1 引言 1.1 项目开发的背景 我国的普铁历史悠久&#xff0c;从19世纪至今已有百来年的历史。新中国以来&#xff0c;铁路的发展速度令人惊叹。但随着发展速度的增快&#xff0c;与之不对应的则是运营安全管理系统的落后。但这些来&#xff0c;我国铁路对于安全的重视程度已经…

代码随想录算法训练营第十六天(二叉树 四)

力扣题部分: 513.找树左下角的值 题目链接:. - 力扣&#xff08;LeetCode&#xff09; 题面: 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路(层序遍历): 应该是这道题最简单的方法了&#xff0…

超文本文档HTML

简单的个人网站 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>欢迎来到我的主页</title> &…

【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;二&#xff09; 前言 蓝牙一般分为传统蓝牙(BR/EDR)&#xff0c;低功耗蓝牙(BLE)两种。 鸿蒙将蓝牙的功能模块分的非常细。 基本上我们会用到access进行蓝牙状态的开启和关闭&#xff0c;以及状态查询。 在使用connection进…

BUUCTF PWN wp--warmup_csaw_2016

第一步 先checksec一下&#xff08;没有启用NX保护、PIE、完整的RELRO和栈保护&#xff0c;还有具有RWX权限的内存段。&#xff09; 分析一下这个文件的保护机制&#xff1a; Arch: amd64-64-little 这表示该可执行文件是为64位的AMD64架构编译的&#xff0c;并且使用的是小…

科大讯飞飞凡计划面经(2024年秋招新出炉)

7月笔完一个多月约的面试 —————————————- 一面8.16 不问项目&#xff0c;上来就是八股轰炸 c11新特性 shared_ptr是线程安全的吗&#xff0c;不安全的话怎么实现线程安全的 stl容器中频繁查找用什么&#xff0c;频繁增删用什么 vector中间插入元素会发生什么&…

NVIDIA Isaac Lab 入门教程(一)

系列文章目录 前言 Isaac Lab 是一个用于机器人学习的统一模块化框架&#xff0c;旨在简化机器人研究中的常见工作流程&#xff08;如 RL、从演示中学习和运动规划&#xff09;。它建立在英伟达 Isaac Sim 的基础上&#xff0c;利用最新的仿真功能实现逼真的场景和快速高效的仿…

74、docker容器编译安装lnmp

一、docker部署lnmp l linux n nginx 1.22 172.111.0.10 docker–nginx m mysql 8.0.30 172.111.0.20 docker–mysql p php 8.1.27 172.111.0.30 docker–php docker&#xff1a;单节点部署&#xff0c;在一台机器上部署&#xff0c;跨了机器容器无法通信&#xff0c;做高…

git 如何生成sshkey公钥

打开git客户端 输入 ssh-keygen -t rsa -b 4096 -C "xxxxxxexample.com" 然后根据提示按enter 或者y 直到出现下图所示 打开 c盘的路径下的文件&#xff0c;/c/Users/18159/.ssh/id_rsa.pub 将id_rsa.pub中的公钥贴到git 网站上的SSH keys即可

网络编程(TCP/UDP)

网络编程 一.网络编程 1.1 概述 ​ Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 ​ Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在Java…

【Hot100】LeetCode—2. 两数相加

目录 1- 思路思路 2- 实现⭐2. 两数相加——题解思路 3- ACM 实现 原题连接&#xff1a;2. 两数相加 1- 思路 思路 分为几个步骤 ①数据结构&#xff1a;遍历指针,进位符、②遍历两个链表、③处理最后的进位符 1- 数据结构 定义 curA 和 curB 用来遍历两个链表定义 carry 记…

ubuntu22.04新机器安装五笔wb、onlyoffice、pyenv、pipenv和虚拟环境virtualenv

wb安装方法 重新开机后右上角点击输入法&#xff0c;在下面打开的界面可以点击配置 左下角shift可快速切换五笔和英文 输入 johnjohn-hp:~$ sudo apt-get install fcitx-table-wbpy johnjohn-hp:~$ sudo apt-get install fcitx-googlepinyin johnjohn-hp:~$ sudo apt-get ins…

二叉树OJ刷题与讲解

1.单值二叉树 题目链接&#xff1a;单值二叉树 题目描述&#xff1a; 这道题要求判断是否是单值二叉树也就是说每个节点的值都要相等才是单值二叉树&#xff0c;如果相等就返回true否则返回false&#xff0c;我们可以使用递归来解这道题&#xff0c;我们把它分为根左子树右子…

Bean对象生命周期流程图

Bean生命周期流程图&#xff1a;https://www.processon.com/view/link/5f8588c87d9c0806f27358c1 Spring扫描底层流程&#xff1a;https://www.processon.com/view/link/61370ee60e3e7412ecd95d43

EmguCV学习笔记 VB.Net 4.5 像素距离和连通区域

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

【数据结构与算法 | 图篇】最小生成树之Kruskal(克鲁斯卡尔)算法

1. 前言 克鲁斯卡尔算法&#xff08;Kruskals algorithm&#xff09;是一种用于寻找加权图的最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;的经典算法。这种算法是由约瑟夫克鲁斯卡尔&#xff08;Joseph Kruskal&#xff09;提出的&#xff0c;并且适用于所有…

七夕情人节动态花瓣表白网页源码

软件介绍 七夕情人节动态花瓣表白网页源码是一款功能强大的表白网页程序&#xff0c;拥有超级好看的花瓣表白效果和多种不同的动态切换效果&#xff0c;非常适合七夕表白活动。 拥有独特的设计风格和花瓣表白效果&#xff0c;可以让用户在表白过程中更加浪漫和温馨。该程序还…

Seaborn:基于 Matplotlib 的高级绘图库,提供了更高级的接口来绘制吸引人的统计图形。

引言 Seaborn 是基于 Matplotlib 的高级数据可视化库&#xff0c;专为绘制统计图形而设计。相比于 Matplotlib&#xff0c;Seaborn 提供了更高级的接口&#xff0c;简化了绘图过程&#xff0c;同时默认的美观配色和样式使得图形更加吸引人。Seaborn 特别适合用于探索性数据分析…

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁)

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材…

springsecurity 登录认证一(ajax)

一、准备工作 1.1 导入依赖 因springboot 3.0 以上版本只能支持java17 顾使用2.5.0 版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><…