[MySQL实战] 如何定义唯一约束(唯一索引)

news2024/11/15 10:32:52

文章目录

    • 一、什么是唯一约束
    • 二、如何定义唯一约束
      • 2.1、建表时定义唯一约束--方法1
      • 2.2、建表时定义唯一约束--方法2
      • 2.3、为已创建的表定义唯一约束
    • 三、删除唯一约束
    • 四、问题
      • 4.1、问题1:如何为多个列定义唯一约束?
    • 五、总结


cover


一、什么是唯一约束

唯一约束,指的是为表中的列提供唯一性保证,以确保列中的数据始终是唯一的。
有两种方式:

  • 将列设为主键
  • 为列增加唯一性约束

 

二、如何定义唯一约束

MySQL中如何定义唯一性约束呢?

有三种方法进行唯一约束的定义:

  • 建表时直接在字段后面增加UNIQUE标识符
  • 建表时在所有列的后面定义唯一约束
  • 已创建的表定义唯一约束

2.1、建表时定义唯一约束–方法1

第一种方法是直接在列的后面增加UNIQUE标识符:

CREATE TABLE `t_test1` (
  `id` bigint NOT NULL PRIMARY KEY COMMENT '主键',
  `name` varchar(50) UNIQUE COMMENT '姓名' ,
  `phone` varchar(20) COMMENT '电话',
  `status` int DEFAULT '10' COMMENT '状态 10启用/20禁用',
  `valid` int DEFAULT '1' COMMENT '是否有效'
) COMMENT='用户表';

说明:

  • UNIQUE 的位置无需处于列的最末尾(如图中所示),后面可定义COMMENT

2.2、建表时定义唯一约束–方法2

第二种方法是在所有列的后面(列定义的最后一行)增加UNIQUE标识符。
语法如下:

UNIQUE $index_name($column_name[,…])

CREATE TABLE `t_test2` (
  `id` bigint NOT NULL PRIMARY KEY COMMENT '主键',
  `name` varchar(50) COMMENT '姓名' ,
  `phone` varchar(20) COMMENT '电话',
  `status` int DEFAULT '10' COMMENT '状态 10启用/20禁用',
  `valid` int DEFAULT '1' COMMENT '是否有效',
  UNIQUE uc_name(name)
) COMMENT='用户表';

说明:

  • uc_name 是唯一索引的名称。
  • 如果写成 UNIQUE (name) ,则唯一索引的名称等于列名。

多个列 添加唯一索引:

CREATE TABLE `t_test2` (
  `id` bigint NOT NULL PRIMARY KEY COMMENT '主键',
  `name` varchar(50) COMMENT '姓名' ,
  `phone` varchar(20) COMMENT '电话',
  `status` int DEFAULT '10' COMMENT '状态 10启用/20禁用',
  `valid` int DEFAULT '1' COMMENT '是否有效',
  UNIQUE uc_id_name(id,`name`)
) COMMENT='用户表';

说明:

  • 只有当id和name都相同时,才认为是相同的数据。下面的数据则认为是不同的
    唯一

也可以通过添加约束的方式定义唯一索引:

CREATE TABLE `t_test3` (
  `id` bigint NOT NULL PRIMARY KEY COMMENT '主键',
  `name` varchar(50) COMMENT '姓名' ,
  `phone` varchar(20) COMMENT '电话',
  `status` int DEFAULT '10' COMMENT '状态 10启用/20禁用',
  `valid` int DEFAULT '1' COMMENT '是否有效',
  CONSTRAINT uc_name UNIQUE(`name`)
) COMMENT='用户表';

注:省略了对多个列增加约束的演示。

2.3、为已创建的表定义唯一约束

如果表已经被创建,也可以对其定义唯一约束。

方法一
语法规则:

ALTER TABLE $table_name ADD UNIQUE [$index_name]($column_name[,…]);

例子:

ALTER TABLE `t_test4`
ADD UNIQUE (`name`);

-- or
ALTER TABLE `t_test4`
ADD UNIQUE uc_name(`name`);
  • 省略唯一索引名称,则其名称和列名相同
  • 多次执行上面的语句,会生成多个唯一索引(针对同一个列)

方法二
语法规则:

ALTER TABLE $table_name ADD CONSTRAINT [$index_name] UNIQUE($column_name[,…]);

例子:

ALTER TABLE `t_test4`
ADD CONSTRAINT UNIQUE(`name`);
-- or
ALTER TABLE `t_test4`
ADD CONSTRAINT uc_name_1 UNIQUE (`name`);
  • CONSTRAINT后面接唯一索引名称,可省略
  • 省略唯一索引名,索引名与列名相同

三、删除唯一约束

当唯一约束不再需要时,可通过下面的方法对其进行删除:

ALTER TABLE `t_test3` DROP INDEX uc_name;

-- 比较
-- ALTER TABLE `t_test3` ADD UNIQUE uc_name (`name`);
  • 在删除唯一约束前,需要知道唯一索引的名称
  • 注意DROP INDEX 中的 INDEX 不能少

比较一下新增唯一索引的脚本:

  • 新增时,ADD 后面接的是 UNIQUE,执行后会生成一个唯一索引
  • 删除时使用的是DROP INDEX,因为唯一约束是一种索引。

四、问题

4.1、问题1:如何为多个列定义唯一约束?

答:这个问题可参考文章的新增唯一约束部分。下面是其中一个简单的做法:

-- 为已存在的表创建唯一约束
ALTER TABLE `t_test4` ADD UNIQUE uc_id_name(id,`name`);

 

五、总结

  本文讲解了MySQL数据库中定义唯一约束的几种方法,并强调了一些注意点。在平时的工作中可以按需选择。

  对于不再需要的唯一约束,可以对其进行删除。因为唯一约束本质上就是索引,所以需要使用索引删除语句对其进行删除。
 
 


参考资料:
https://www.w3schools.cn/mysql/mysql_unique.asp
https://www.cnblogs.com/sun-yanglu/p/9581701.html

 
 
 
 

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

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

相关文章

C语言学习 四、选择与循环

4.1关系表达式与逻辑表达式 算术运算符的优先级高于关系运算符关系运算符的优先级高于逻辑与 和 逻辑或运算符相同优先级的运算符从左到右进行结合 【例】 表达式 5 > 3 && 8 < 4 - !0 的最终值为多少 4.2 if-else语句 4.2.1 if-else单分支语句 if判断条件&am…

使用OpenCV将图片切割成小图 及图片拼接(附python代码)

文章目录 1. 图片切割2. 图片拼接3. AcknowledgmentReference 要分割的图片如下&#xff1a; 1. 图片切割 思路也比较简单&#xff0c;代码注释比较详细&#xff0c;看代码就行。 from cv2 import cv2 import numpy as np import ospic_path .jpg # 分割的图片的位置 pic_ta…

【嵌入式——QT】QWT应用

【嵌入式——QT】QWT应用 概述步骤一步骤二步骤三代码声明代码实现图示 概述 QWT&#xff0c;全称Qt Widgets for Technical Applications&#xff0c;是一个基于Qt开发的第三方库。它主要为具有技术背景的程序提供GUI组件和一组实用类&#xff0c;用于生成各种统计图。QWT的主…

【CPP】C++11多线程

thread类 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库&#xff0c…

深度学习500问——Chapter04:经典网络解读(1)

文章目录 4.1 LeNet-5 4.1.1 模型介绍 4.1.2 模型结构 4.1.3 模型特性 4.2 AlexNet 4.2.1 模型介绍 4.2.2 模型结构 4.2.3 模型特性 4.3 ZFNet 4.3.1 模型介绍 4.3.2 模型结构 4.3.3 模型特性 4.4 Network in Network 4.4.1 模型介绍 4.4.2 模型结构 4.4.3 模型特性 4.1 LeNet-…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口&#xff1a;7001&#xff0c;历史漏洞&#xff1a;CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞&#xff1a;CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

安卓 Android Activity 生命周期

文章目录 Intro生命周期方法 & 执行顺序结论code Intro 本文提供一个测试类通过打印的方式展示在多个Activity之间互相跳转的时候&#xff0c;各个Activity的生命周期相关方法的执行顺序。 生命周期方法 & 执行顺序结论 下图出自 郭霖 《第一行代码&#xff08;第二…

深度学习pytorch——激活函数损失函数(持续更新)

论生物神经元与神经网络中的神经元联系——为什么使用激活函数&#xff1f; 我们将生物体中的神经元与神经网络中的神经元共同分析。从下图可以看出神经网络中的神经元与生物体中的神经元有很多相似之处&#xff0c;由于只有刺激达到一定的程度人体才可以感受到刺激&#xff0c…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后&#xff0c;安装WSL2&#xff0c;最后安装WSL的Ubuntu发布版&#xff0c;尝试网上各种方法&#xff0c;还是出现文章第三节所写的问题&#xff0c;差点被这问题搞放弃了&#xff0c;全网少有针对这个问题的答案&#xff0c;有也不顶用&…

python-pandas基础学习

可参考&#xff1a; pandas&#xff1a;http://pandas.pydata.org/docs/user_guide/10min.html 一、基础知识 DataFrame 方法&#xff0c;可以将一组数据&#xff08;ndarray、series, map, list, dict 等类型&#xff09;转化为表格型数据 import pandas as pd data {name: …

Python代码规范化

什么是代码规范化&#xff1f; 代码的规范化书写是指按照一定的规范和标准编写代码&#xff0c;使得代码结构清晰、易于阅读和理解。 代码规范化的意义 Python代码规范化的意义在于提高代码可读性、可维护性和可重用性&#xff0c;从而使代码更易于理解、调试和协作&#xff0c…

解锁AI生成模型的无限可能:Stability-AI 带你领略前沿科技

厌倦了千篇一律的图片和视频&#xff1f;想要创作独一无二的艺术作品&#xff1f;Stability-AI 横空出世&#xff0c;为你打开通往 AI 生成模型的大门&#xff0c;带你领略前沿科技的无限可能&#xff01; 神奇的功能&#xff0c;尽在掌握 Stability-AI 拥有众多令人惊叹的功能…

AI基础知识(4)--贝叶斯分类器

1.什么是贝叶斯判定准则&#xff08;Bayes decision rule&#xff09;&#xff1f;什么是贝叶斯最优分类器&#xff08;Bayes optimal classifier&#xff09;&#xff1f; 贝叶斯判定准则&#xff1a;为最小化总体风险&#xff0c;只需在每个样本上选择那个能使条件风险最小的…

js - 练习题

文章目录 FED3&#xff1a;查找两个节点的最近的一个共同父节点FED4&#xff1a;根据包名&#xff0c;在指定空间中创建对象FED5: 数组去重FED6&#xff1a;用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) 1, f(2) 1 等FED12&#xff1a;字符串统计FED17&am…

联想ThinkSystem服务器主要硬件Windows Server驱动下载说明

故障现象&#xff1a; 不知道如何获取ThinkSystem系列服务器在Windows Server操作系统下的驱动程序&#xff1f; 解决方案&#xff1a; 本文提供ThinkSystem系列服务器安装Windows Server操作系统所需要的驱动程序下载说明。 以下多路机型的Windows Server 2012 R2及2016驱动…

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d&#xff08;指定家目录&#xff09;3.3 -g&#xff08;指定用户组&#xff09;3.4 -G&#xff08;指定附属组&#xff09;3.5 -p&#xff08;加密密码&#xff09;3.6 -e&#xff08;指…

【JDBC编程】Java连接MySQL的五个步骤

目录 JDBC编程 1.JDBC的使用 2.数据库连接Connection 3.Statement对象 4.ResultSet对象 JDBC编程 JDBC编程运用了MySQL提供的 Java 的驱动包 mysql-connector-java &#xff0c;需要基于 Java 操作 MySQL 即需要该驱动包。同样的&#xff0c; 要基于 Java 操作 Oracle 数据库…

XML Data – Semi-Structured Data XML 数据 - 半结构化数据

Outline • Structured, Semistructured, and Unstructured Data • XML Hierarchical (Tree) Data Model • Extracting XML Documents from Relational Databases • XML Documents, DTD, and XML Schema • XML Languages 结构化、半结构化和非结构化数据 - XML 层次&#x…

Java最后一块石头的重量 II(力扣Leetcod1049)

最后一块石头的重量 II 力扣原题 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…