MySQL基础扎实——主键与候选键

在这里插入图片描述

词义解释

主键(Primary Key)和候选键(Candidate Key)是关系型数据库中的术语,用于标识和唯一确定表中的记录。它们之间有以下区别:

  1. 唯一性:主键是表中的唯一标识,每个表只能有一个主键,而候选键是可以作为主键的备选项,并且每个候选键也必须具有唯一性。

  2. 空值(NULL):主键不允许包含空值(NULL),也就是说,主键必须在每个记录中都有一个非空值。而候选键可以包含空值或重复值。

  3. 唯一标识性:主键用于唯一地标识表中的每个记录,确保每个记录具有唯一的标识符。候选键也具有唯一性,但它们可能会被用作其他目的,如参照外键或用于数据的逻辑关联。

  4. 选择性:主键是必选的,也就是说,每个记录必须具有主键值。而候选键可以被选择性地用作主键,当然,前提是满足唯一性和非空的要求。

需要注意的是,候选键可能包含多个列,这种情况下称为复合候选键(Composite Candidate Key)。复合候选键要求组合键的值在全表中都是唯一的,但单独的每一列可能不满足唯一性。

综上所述,主键在关系型数据库中具有特殊的作用,用于标识和唯一确定表中的记录,而候选键是可以代替主键的备选项,但它们需要满足唯一性和非空性的要求。

创建主键

要创建主键,可以在表的创建过程中或表已存在时使用 ALTER TABLE 语句来指定主键约束。下面是几种常见的创建主键的示例代码:

在表的创建过程中指定主键:

-- 创建一个学生表,并指定主键
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    student_name VARCHAR(50) NOT NULL,
    student_email VARCHAR(50),
    student_age INT,
    student_major VARCHAR(50)
);

上述代码中,student_id 列被指定为主键。

在表已存在时使用 ALTER TABLE 添加主键约束:

-- 在已存在的表上添加主键约束
ALTER TABLE students 
ADD CONSTRAINT pk_students PRIMARY KEY (student_id);

上述代码中,students 表已存在,并使用 ALTER TABLE 语句添加了名为 pk_students 的主键约束,该主键由 student_id 列组成。

无论是在表的创建过程中还是在已存在的表上使用 ALTER TABLE 添加主键约束,都需要指定主键所涉及的列,并为主键指定一个名称(可选)。

创建主键约束后,数据库会自动确保被指定为主键的列包含唯一的、非空的值。如果试图插入具有相同主键值的记录或将空值插入主键列,则会导致插入失败或触发错误。

创建候选键

在关系型数据库中,候选键是能够唯一标识每行数据的一组列。它们可以由一个或多个列组成。以下是创建候选键的示例代码:

在表的创建过程中指定候选键:

-- 创建一个员工表,并指定候选键
CREATE TABLE employees (
    employee_id INT,
    employee_name VARCHAR(50) NOT NULL,
    employee_email VARCHAR(50) UNIQUE,
    employee_department VARCHAR(50),
    employee_salary DECIMAL(10, 2),
    CONSTRAINT uk_employee_email_department UNIQUE (employee_email, employee_department)
);

上述代码中,候选键由 employee_emailemployee_department 列组成。通过 CONSTRAINT 关键字,我们在表的创建过程中指定了候选键的约束,并为候选键指定了名称 uk_employee_email_department

在已存在的表上使用 ALTER TABLE 添加候选键约束:

-- 在已存在的表上添加候选键约束
ALTER TABLE employees 
ADD CONSTRAINT uk_employee_email_department UNIQUE (employee_email, employee_department);

上述代码中,employees 表已存在,并使用 ALTER TABLE 语句添加了名为 uk_employee_email_department 的候选键约束,该候选键由 employee_emailemployee_department 列组成。

无论是在表的创建过程中还是在已存在的表上使用 ALTER TABLE 添加候选键约束,都需要指定候选键所涉及的列,并为候选键指定一个名称(可选)。

候选键约束确保候选键所涉及的列数据的组合是唯一的。这意味着不允许插入重复的候选键组合值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker 的compose安装

1. Docker Compose 环境安装 Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose 下载 curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker…

uniapp JS文件里面调用自定义组件(不用每个页面在template中加组件标签)

前言 工具:uniapp 开发端:微信小程序 其他:uview 2.0 场景:路由器里面,统一验证是否已登录,如果没登录,则直接弹出登录弹窗出来,不管哪个页面都如此。 效果如下: 直接上…

gin 中间件流程控制:Next()、 Abort()

gin 中间件流程控制 Next() 源码注释:Next应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。 通俗的说,就是中间件放行,当一个中间件代码执行到Next(),会先执行它之后的函数,最后再来执行完本函…

Excel双向柱状图的绘制

Excel双向柱状图在绘制增减比较的时候经常用到,叫法繁多,双向柱状图、上下柱状图、增减柱状图都有。 这里主要介绍一下Excel的基础绘制方法和复杂一点的双向柱状图的绘制 基础双向柱状图的绘制 首先升降的数据如下: 月份上升下降20220359-…

给el-table实现列显隐

用过若依的都知道,在使用el-table 时候,实现列显隐效果是要给每个列加v-if 判断的,这种代码过于繁琐,于是翻看el-table包的代码,调试后发现内部的【插入】和【删除】两个方法可以达到我们要的效果。 项目不提供源码&a…

哈希表的简单模拟实现

文章目录 底层结构哈希冲突闭散列定义哈希节点定义哈希表**哈希表什么情况下进行扩容?如何扩容?**Insert()函数Find()函数二次探测HashFunc()仿函数Erase()函数全部的代码 开散列定义哈希节点定义哈希表Insert()函数Find()函数Erase()函数总代码 初识哈希…

《golang设计模式》第一部分·创建型模式-02-原型模式(Prototype)

文章目录 1. 概念1.1 简述1.2 角色1.3 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念 1.1 简述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 1.2 角色 Prototype(抽象原型类):它是声明克隆方法的接口…

ST官方基于米尔STM32MP135开发板培训课程(一)

本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例,讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载: ‍https://www.st.com/en/embedded-software/stm32mp1dev.ht…

【Redis】如何实现一个合格的分布式锁

文章目录 参考1、概述2、Redis粗糙实现3、遗留问题3.1、误删情况3.2、原子性保证3.3、超时自动解决3.4、总结 4、Redis实现优缺5、集群问题5.1、主从集群5.2、集群脑裂 6、RedLock7、Redisson7.1、简单实现7.2、看门狗机制 参考 Redisson实现Redis分布式锁的N种姿势 (qq.com)小…

如何评判算法好坏?复杂度深度解析

如何评判算法好坏?复杂度深度解析 1. 算法效率1.1 如何衡量一个算法好坏1.2 算法的复杂度 2 时间复杂度2.1 时间复杂度的概念2.1.1 实例 2.2 大O的渐进表示法2.3 常见时间复杂度计算举例 3 空间复杂度4 常见复杂度对比5 结尾 1. 算法效率 1.1 如何衡量一个算法好坏 …

接口自动化测试要做什么?8个步骤讲的明明白白(小白也能看懂系列)

先了解下接口测试流程: 1、需求分析 2、Api文档分析与评审 3、测试计划编写 4、用例设计与评审 5、环境搭建(工具) 6、执行用例 7、缺陷管理 8、测试报告 那"接口自动化测试"怎么弄?只需要在上篇文章的基础上再梳理下就…

Web3.0实战(02)-联盟链入门讲解

联盟链是介于公有链和私有链之间,具备部分去中心化的特性。 联盟链是由若干机构联合发起,由盟友共同来维护,它只针对特定某个群体的成员和有限的第三方开放。 8.1 部分去中心化 联盟链只属于联盟内部的成员所有,联盟链的节点数…

SpringBoot整合Elasticsearch

SpringBoot整合Elasticsearch SpringBoot整合Elasticsearch有以下几种方式: 使用官方的Elasticsearch Java客户端进行集成 通过添加Elasticsearch Java客户端的依赖,可以直接在Spring Boot应用中使用原生的Elasticsearch API进行操作。参考文档 使用Sp…

为什么要学框架?什么是Spring?

为什么要学框架?什么是Spring? 一、为什么要学框架? 学习框架相当于从 “小作坊” 到 “工厂” 的升级,小作坊什么都要自己做,工厂是组件式装配,特点就是高效。框架更加易用、简单且高效。 框架的优点展…

7.26 作业 QT

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff1a; 结果图&#xff1a; second.h: #define SECOND_H#include <QWidget> #include<QDebug> //信息调试类&#xff0c;用于打印输出的 #inc…

【C语言初阶】指针篇—上

目录 1. 指针是什么&#xff1f;2. 指针和指针类型2.1 指针-整数2.2 指针的解引用 3. 野指针3.1 野指针成因1. 指针未初始化2. 指针越界访问3. 指针指向的空间释放 3.2 如何规避野指针 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; > 1…

【Nodejs】Express模板使用

1.Express脚手架的安装 安装Express脚手架有两种方式&#xff1a; 使用express-generator安装 使用命令行进入项目目录&#xff0c;依次执行&#xff1a; cnpm i -g express-generator可通过express -h查看命令行的指令含义 express -hUsage: express [options] [dir] Optio…

spring eurake中使用IP注册

在开发spring cloud的时候遇到一个很奇葩的问题&#xff0c;就是服务向spring eureka中注册实例的时候使用的是机器名&#xff0c;然后出现localhost、xxx.xx等这样的内容&#xff0c;如下图&#xff1a; eureka.instance.perferIpAddresstrue 我不知道这朋友用的什么spring c…

【Redis】高级篇: 一篇文章讲清楚Redis的单线程和多线程

目录 面试题 Redis到底是多线程还是单线程&#xff1f; 简单回答 详解 Redis的“单线程” Redis为什么选择单线程&#xff1f; 后来Redis为什么又逐渐加入了多线程特性&#xff1f; Redis为什么快&#xff1f; 回答 IO多路复用 Unix网络编程的5种IO模型 主线程和IO…

常见面试题之常见技术场景

1. 单点登录这块怎么实现的&#xff1f; 1.1 概述 单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称 SSO &#xff09;&#xff0c;只需要登录一次&#xff0c;就可以访问所有信任的应用系统。 在以前的时候&#xff0c;一般我们就单系统&#xff0c;所有的…