数据库 --- 约束

2023-11-18

一、什么是约束?常见的约束有那些?

约束是在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。

常见的约束有:非空约束(not null)、唯一约束(unique)、主键约束(primary key)、外键约束(foreign key)、检查约束(check)<Oracle 数据库有 check 约束>

非空约束:约束的字段不能为NULL

唯一约束:约束的字段不能重复

主键约束:(PK)约束的字段既不能为NULL,也不能重复

外键约束:(FK)

二、非空约束 not null

create table t_user(id int,username varchar(255) not null,password varchar(255));

insert into t_user(id,username,password) values(1,'123','111111');

注意:not null 只有列级约束,没有表级约束

三、唯一约束 unique

唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL

案例:给某一列添加 unique

案例:给两个列或者多个列添加 unique 

create table t_user (id int, usercode varchar(255), username varchar(255),  unique(usercode,username));                                  //多个字段联合添加约束(表级约束)

create table t_user (id int, usercode varchar(255) unique, username varchar(255),unique);   //列级约束

 四、关键约束 primary key

怎么给一张表添加主键约束呢?

drop table if exists t_user;

create table t_user(id int primary key,username varchar(255),email varchar(255));

insert into t_user(id,username,email) values(1,'zs','zs@123.com');

insert into t_user(id,username,email) values(2,'ls','ls@123.com');

insert into t_user(id,username,email) values(3,'ww','ww@123.com');

select * from t_user;

insert into t_user(id,username,email) values(1,'jack','jack@123.com');

insert into t_user(username,email) values('jack','jack@123.com');

通过以上测试得出,id 是主键,因为添加了主键约束,主键字段中的数据不能为NULL,也不能重复。

 主键相关术语:主键约束、主键字段、主键值

主键作用:表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。

                  主键值是这行记录在这张表中的唯一标识。

                  一张表的主键约束只能有一个。

主键分类:

根据主键字段的字段数量来划分:单一主键和复合主键(多个字段联合起来添加一个主键约束,但复合主键不适合使用,因为复合主键违背三范式。)

根据主键性质来划分:自然主键和业务主键(主键值和业务挂钩,例如:拿银行卡卡号作为,不推荐使用)最好不要拿着和业务挂钩的字段作为主键,因为以后的业务变化一旦发生改变的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。

使用表级约束方式定义主键:

drop table if exists t_user;

create table t_user(id int,username varchar(255),primary key(id));

insert into t_user(id,username) values(1,'zs');

insert into t_user(id,username) values(2,'ls');

insert into t_user(id,username) values(3,'ww');

select * from t_user;

Mysql 提供主键值自增

drop table if exists t_user;

create table t_user(id int primary key auto_increment,username varchar(255));

insert into t_user(username) values('zs');

insert into t_user(username) values('ls');

insert into t_user(username) values('ww');

select * from t_user;

 

 五、外键约束

外键约束的相关术语:
外键约束:foreign key

外键字段:添加有外键约束的字段

外键值:外键字段中的每一个值

业务背景:

请设计数据库表,用来维护学生和班级的信息。

第一种方案:一张表存储所有数据(有冗余)

第二种方案:两张表(班级表和学生表)

 将以上表的建表语句写出来:
t_student 中的classno字段引用 t_class 表中的cno字段,此时t_student 表叫做子表,t_class表叫做父表。

删除数据的时候,先删除子表,再删除父表;

添加数据的时候,先添加父表,再添加子表;

创建表的时候,先创建父表,再创建子表;

删除表的时候,先删除子表,再删除父表。

 drop table if exists t_student;

 drop table if exists t_class;

create table t_class(cno int primary key,cname varchar(255));

create table t_student(sno int ,sname varchar(255),classno int, foreign key(classno) references t_class(cno));

insert into t_class values(101,'abc'),(102,'def');

insert into t_student values(1,'zs1',101),(2,'zs2',101),(3,'zs3',102),(4,'zs4',102),(5,'zs5',102),(6,'zs6',102);

select * from t_user;

select * from t_student;

 外键可以为NULL?

注意:被引用的字段不一定是主键,但至少具有unique约束。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库 --- 约束 的相关文章

  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle
  • VB SQL 语句未选择正确的行

    我试图使用 SELECT 语句在我的数据库中 选择 一个人 但它没有选择正确的人 我也不确定为什么 我正在使用访问数据库 数据库连接代码 Imports System Data OleDb Module Database Connectio
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • 扁平化/反规范化 SQL 查找表的最佳方法?

    我有很多这样的表 Lookup HealthCheckupRisks ID Name 1 Anemia 2 Anorexic 3 Bulemic 4 Depression 122 Syphilis PatientRisksOnCheckup
  • 使用全文搜索查找精确匹配

    使用 Sql Server 2008 如何使用全文搜索来实际找到精确的字符串匹配 我对此感到非常困难 而且我在网上找不到令人满意的解决方案 例如 如果我正在搜索字符串 Bojan Skrchevski 我希望第一个结果正是如此 到目前为止
  • Azure COSMOS DB 如何查询数组中的内容

    如何进行查询以获取文档数组 roles 中包含某些内容的文档 我想获取以下文档 其中 Trainer 是数组中的元素 enabled true profilePicture null roles Trainer Client SELECT
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • T-SQL 中是否有 LIKE 语句的替代方案?

    我有一个场景我需要执行以下操作 SELECT FROM dbo MyTable WHERE Url LIKE
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • 如何在sql server中对行号进行内连接

    SQL Server 2008 两张表 表A有以下数据 RowA RowB RowC RowD 表B有以下数据 Row4 Row3 Row2 Row1 我想得到以下输出 RowA Row1 RowB Row2 RowC Row3 RowD
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 交换 ms-sql 表

    我想以尽可能最好的方式交换到桌子 我有一个 IpToCountry 表 并根据导入的外部 CSV 文件每周创建一个新表 我发现进行切换的最快方法是执行以下操作 sp rename IpToCountry IpToCountryOld go
  • mysql LIKE 查询时间太长

    SQL SELECT COUNT usr id as total results FROM users as usr LEFT JOIN profile as prof ON prof uid usr uid WHERE usr usern
  • 如何将列中的天数添加到 DB2 中的当前日期?

    我正在编写此 SQL 来动态计算一定的天数 如下所示 但我不知道如何让它工作 因为我不断收到错误 select Current Date Dynamic numbr of days calculation here from TableNa
  • 在 Access 数据库中对列包含数字和字母的数据进行排序

    请帮助我 因为我一直无法做到这一点 选择此列 columnA 的访问 SQL 是什么 以便它返回一个结果集 其中的不同值首先根据数字排序 然后根据字母排序 这是列值 10A 9C 12D 11G 9B 10C 9R 8T 我尝试过 从 tb
  • Postgres 中 -Infinity 和 Infinity 的适当值

    在一种情况下 我们必须在 Postgres DB 中存储 无穷大和 无穷大的值 应该考虑什么合适的值 如果没有 请建议最合适的替代方案 你实际上可以使用 infinity and infinity for FLOAT4 and FLOAT8
  • 每行中非空列的计数

    我有一个包含 4 列的表 在第 5 列中我想存储前 4 列中有多少个非空列的计数 例如 其中 X 是任意值 Column1 Column2 Column3 Column4 Count X X NULL X 3 NULL NULL X X 2

随机推荐

  • 图像处理知识框架

    转自https blog csdn net hitwengqi article details 8292675 花了点时间整理了一下数字图像处理知识体系 从宏观上把握图像处理 使自己的学习思路就更加清晰 1 本文大部分内容来自 http b
  • Vue前端框架12 组件生命周期、生命周期的应用、动态组件、组件保持存活、异步组件、依赖注入、Vue应用原理

    文章目录 一 组件生命周期 二 生命周期的应用 三 动态组件 四 组件保持存活 五 异步组件 六 依赖注入 七 Vue应用 一 组件生命周期 每个Vue组件在创建时需要经历一系列的初始化步骤 比如设置侦听 编译模板 挂载实例到DOM 或者数
  • Matlab中的矩阵合并操作

    Matlab中的矩阵合并操作 矩阵是Matlab中最常用的数据结构之一 矩阵合并也是一个十分实用的操作 本文将介绍在Matlab中如何进行矩阵合并 并提供相应的源代码 在Matlab中 可以用方括号 来表示一个矩阵 矩阵合并可以分为横向合并
  • 【iOS】push与present Controller的区别

    文章目录 前言 一 push方法 二 pop方法 三 present方法 四 dismiss方法 五 dismiss多级的方法 举例 动画 前言 iOS推出与退出界面有两种方式 push与present 接下来笔者分别介绍这两种方式 一 p
  • Lcd(一)显示原理

    一 LCD控制原理 S5PV210处理器中自带LCD控制器 控制LCD的显示 把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口 类型 1 STN 超扭曲向列 它的特点是功耗低 但亮度不
  • 图片隐写神器Stegsolve安装教程

    首先需要配置电脑的java环境 网上有教程 通过该链接 www caesum com handbook Stegsolve jar 下载Stegsolve jar 有Java环境的话会自动选择使用Java打开 如下图 功能分析 File F
  • 【Bitlocker篇】BitLocker无法加密系统盘,提示正在启动Bitlocker,系统找不到指定的文件的解决方案

    Bitlocker篇 BitLocker无法加密系统盘 提示正在启动Bitlocker 系统找不到指定的文件的解决方案 先排除先天不足因素 1 首先电脑硬件支持TPM 2 电脑系统支持BitLocker加密 3 除系统盘外其他盘能正常启用B
  • 硬件产品经理:从入门到精通(新书发布)

    目录 简介 新书 框架内容 相关课程 简介 在完成多款硬件产品从设计到推向市场的过程后 笔者于2020年开始在产品领域平台输出硬件相关的内容 在这个过程中经常会收到很多读者的留言 希望能推荐一些硬件相关的书籍或资料 其实 笔者刚开始做硬件产
  • Win10 警告-已计划将多个默认网关用于提供单一网络例如Intranet或Internet)的冗余…的解决方案

    电脑因为硬盘故障更换了硬盘重新安装了系统 按照以前设置的IP地址重新设置 但是总是出现 警告 已计划将多个默认网关用于提供单一网络 折腾了好久 不得其解 最后 把 控制面板 网络和 Internet 网络连接 里的 WLAN 蓝牙网络连接
  • Linux文件系统实验(C语言实现新建、打开、关闭、读写文件以及查改文件权限)

    操作系统实验导航 实验一 银行家算法 https blog csdn net weixin 46291251 article details 115384510 实验二 多级队列调度和多级反馈队列调度算法 https blog csdn n
  • mac用终端登陆PostgreSQL时出现-bash: psql: command not found

    系统无psql命令 此时要将postgresql 的 bin 目录添加到环境变量中 注意你的postgresql在哪 还有它的版本 推荐前往 Applications和 Library确认 export PATH Library Postg
  • 开源LLM「RWKV」想要打造AI领域的Linux和Android|ChatAI

    RWKV想逐步成为最强开源模型 中期计划取代Transformer 能如愿吗 我们没有护城河 OpenAI也是 近期 谷歌内部人士在Discord社区匿名共享了一份内部文件 点破了谷歌和OpenAI正面临的来自开源社区的挑战 尽管经外媒Se
  • [2019计算机视觉]——贪心学院 学习笔记 1.环境配置

    环境 硬件环境 我的硬件环境是 Intel I7 8750H GTX 1060 系统环境 anaconda 4 5 11 Ubuntu18 04 软件环境 名称 版本 python 3 6 7 cuda 9 0 cudnn 7 4 Tens
  • 一键生成微信小程序的制作工具-小程序切片工具

    微信小程序前端开发者工具 小程序切片 是一款根据效果图像画画一样来设计微信小程序 自动生成导出前端页面的快速开发工具 可以很方便 快速地生成小程序的wxml wcss js文件 可以大大提高您的工作效率 减少前端布局的编写工作 功能如下 1
  • Node(4)

    文章目录 express跨域解决 路由传参 静态资源渲染 serve static MVC 1 新建文件夹 routers 路由管理utils工具类 2 新建文件夹 controller 请求处理 3 新建文件夹 model service
  • TensorRT学习(实战-自定义算子)

    YOLOv4进行TensorRT推理的时候会使用Mish激活函数 而使用到的mish激活函数没有在TensorRT进行实现 故需要进行实现对应TensorRT插件 故需要进行Mish激活函数的实现 Mish激活函数定义 def mish f
  • Arduino - 字符判断函数

    Arduino 字符判断函数 字符判断函数 虽然在实际编程中可能很少使用到 但是可以作为知识储备 有必要了解一些 这些函数包含在ctype h当中 Arduino IDE路径 C Program Files x86 Arduino hard
  • Python入门教程完整版,Python所有方向学习体系,学完即可就业

    今天给大家带来了干货 Python入门教程完整版 完整版啊 完整版 言归正传 小编该给大家介绍一下这套教程了 希望每个小伙伴都沉迷学习 无法自拔 本套教程学习时间15天 1 3天内容 为Linux基础命令 4 13天内容 为Python基础
  • 导入 导出 jeesite框架封装

    为什么80 的码农都做不了架构师 gt gt gt JeeSite的Excel导入 导出 支持大数据量 使用annotation最小化配置 介绍 对Apache POI 3 9的简单封装 实现Excel的导出导入功能 使用Annotatio
  • 数据库 --- 约束

    一 什么是约束 常见的约束有那些 约束是在创建表的时候 可以给表的字段添加相应的约束 添加约束的目的是为了保证表中数据的合法性 有效性 完整性 常见的约束有 非空约束 not null 唯一约束 unique 主键约束 primary ke