Mysql数据唯一索引与唯一约束案例总结

唯一约束的说明

唯一约束是约束(CONSTRAINT)里的一种,常见的还有主键、外检、默认值、是否为空、检查等。唯一约束即限制某个或某些字段具有唯一性(不能重复)。

唯一索引的说明

唯一索引是只允许索引中的每个值对应记录的一行,这就像身份标识一样,每个人都只有一个。

代码验证

创建表时指定唯一约束

CREATE TABLE tb_unique
(id int,
name varchar(20) UNIQUE,
addr varchar(30),
age int
)

:1 当某个字段被指定为UNIQUE时会自动产生唯一索引。
       2 在某个字段定义为唯一时还可以通过修改表时对该字段再次定义为UNIQUE,不过这显然没太大意义。再SHOW INDEX FROM tablename时可查看到多个关于该字段UNIQUE的重复定义。

创建表时指定复合多字段唯一约束

CREATE TABLE tb_unique2
(id int,
name varchar(20),
addr varchar(30),
age int,
PRIMARY key(id),
UNIQUE KEY com_nameadrr (name,addr),
KEY age (age)
)

:1 这里的KEY age(age)意为普通索引。可通过查看索引命令SHOW INDEX FROM tablename命令查看,详细的见查看索引部分。

通过数据字典查看表的约束

select * FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_NAME='tb_unique' AND CONSTRAINT_TYPE='UNIQUE'/* 结果
CONSTRAINT_CATALOG     CONSTRAINT_SCHEMA       CONSTRAINT_NAME    TABLE_SCHEMA    TABLE_NAME       CONSTRAINT_TYPE
def  shenl      name      shenl      tb_unique      UNIQUE*/

通过修改表创建唯一约束

ALTER TABLE tb_unique ADD CONSTRAINT cons_uniquename UNIQUE(addr);
select * FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_NAME='tb_unique' AND CONSTRAINT_TYPE='UNIQUE'/* 结果
CONSTRAINT_CATALOG     CONSTRAINT_SCHEMA       CONSTRAINT_NAME    TABLE_SCHEMA    TABLE_NAME       CONSTRAINT_TYPE
def  shenl      name      shenl      tb_unique      UNIQUE
def  shenl      cons_uniqueaddr  shenl      tb_unique      UNIQUE
*/

创建表时指定唯一索引

CREATE TABLE tb_uniqueidx
(id int,
name varchar(20) UNIQUE,
addr varchar(30),
age int,
UNIQUE INDEX idx_name(name(20) ASC)
)-- 通过show create table查看表创建脚本。
show create table tb_uniqueidx;
/* 结果
Table     Create Table
tb_uniqueidx CREATE TABLE `tb_uniqueidx` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`addr` varchar(30) DEFAULT NULL,`age` int(11) DEFAULT NULL,UNIQUE KEY `name` (`name`),UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
*/-- 约束里查看查看Unique和索引信息。
select * FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_NAME='tb_uniqueidx' AND CONSTRAINT_TYPE='UNIQUE'
/*结果
CONSTRAINT_CATALOG   CONSTRAINT_SCHEMA    CONSTRAINT_NAME TABLE_SCHEMA  TABLE_NAME       CONSTRAINT_TYPE
def  shenl      name     shenl      tb_uniqueidx UNIQUE
def  shenl      idx_name      shenl      tb_uniqueidx UNIQUE
*/

修改表时指定唯一索引

CREATE UNIQUE INDEX idx_addr ON tb_uniqueidx (addr (30) DESC);
ALTER TABLE tb_uniqueidx ADD UNIQUE INDEX idx_addr2 (addr (30) DESC);
-- 通过key关键字和index效果一样。
ALTER TABLE tb_uniqueidx ADD UNIQUE KEY idx_addr2 (addr (30) DESC);

查看索引信息

show index from tb_unique2/* 部分结果
tb_unique2    0     PRIMARY       1     id
tb_unique2    0     com_nameadrr     1     name
tb_unique2    0     com_nameadrr     2     addr
tb_unique2    1     age  1     age
*/

删除索引

DROP INDEX idx_addr ON tb_uniqueidx
alter table tb_uniqueidx drop index idx_addr2;

唯一索引与NULL

CREATE TABLE tb_uniqueidx
(id int,
name varchar(20) UNIQUE,
addr varchar(30),
age int,
PRIMARY KEY(id),
UNIQUE INDEX idx_name(addr(30) ASC)
)-- 插入多条为NULL的值到建立唯一索引的字段里
INSERT INTO tb_uniqueidx VALUES(1,'Tom','Shanghai',30);
INSERT INTO tb_uniqueidx VALUES(2,'Tim',NULL,40);
INSERT INTO tb_uniqueidx VALUES(3,'John',NULL,40);

由此可见唯一索引对NULL值是免疫的,即并不能约束它(NULL)。

触发器约束唯一索引里的NULL

-- 通过约束只能输入一次NULL值,触发器需要在表没有数据时即创建。
CREATE TRIGGER trg_tb_uniqueidx
BEFORE INSERT ON tb_uniqueidx
FOR EACH ROW
BEGIN
DECLARE v_errmsg, v_value text;
IF EXISTS(SELECT 1 FROM tb_uniqueidx WHERE addr <=> NEW.addr) THEN
IF NEW.addr IS NULL THEN
SET v_value = 'NULL';
ELSE
SET v_value = CONCAT('''', NEW.addr, '''');
END IF;
SET v_errmsg = CONCAT('重复的值 ',v_value,' 出现在字段 addr 里');
SIGNAL SQLSTATE '23000'
SET MESSAGE_TEXT = v_errmsg,
MYSQL_ERRNO = 1062;
END IF;
END-- 当我们再次插入NULL值时则会报错。
INSERT INTO tb_uniqueidx VALUES(4,'Kate',NULL,50);

NOT NULL结合UNIQUE一起使用

该方法即将NOT NULL和UNIQUE约束一起使用。

CREATE TABLE tb_uniqueidx
(id int,
name varchar(20) UNIQUE,
addr varchar(30) NOT NULL UNIQUE,
age int,
PRIMARY KEY(id),
UNIQUE INDEX idx_name(addr(30) ASC)
)

Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)相关推荐

  1. Spark踩坑记——数据库(Hbase+Mysql)转

    转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...

  2. 在百度地图中叠加CAD图及GIS数据展示踩坑记

    前言 在之前的几篇博客中分别介绍了 在Cesium中实现与CAD的DWG图叠加显示分析 https://www.cnblogs.com/vjmap/p/16541751.html . 高德地图与CAD ...

  3. CentOS7环境下MySQL踩坑记

    1.启动/配置/编码等问题 安装包放在opt目录下 安装:rpm -ivh rpm 软件名 如果安装时,与某个软件 xxx冲突,则需要将冲突的软件卸载掉: yum -y remove xxx 修改密码 ...

  4. 谷粒商城笔记+踩坑(9)——上架商品spu到ES索引库

    导航: 谷粒商城笔记+踩坑汇总篇 目录 1.ES回顾 2.ES整合商品上架 2.1.分析 2.2.创建sku的es索引库 2.2.1.两种索引库设计方案分析 2.2.2.最终选用的索引库方案,nest ...

  5. from mysql partition select_玩转select条件查询,避免踩坑

    条件查询 语法: select 列名 from 表名 where 列 运算符 值 说明: 注意关键字where,where后面跟上一个或者多个条件,条件是对前面数据的过滤,只有满足where后面条件的 ...

  6. AB测试实战案例讲解及踩坑事项

    Hey,我是小z 今天我们来结合流程,讲讲具体的AB测试案例,以及AB测试中需要注意的问题,还有面试中可能会踩的坑. AB测试案例串讲 大体背景如下: 某社交APP增加了"看一看" ...

  7. Mysql数据类型TINYINT(1)与BOOLEAN踩坑记

    熟悉Mysql的同学应该都知道,Mysql查询的boolean结果将输出为0或者1. 比如: select 1=1; 其输出结果为1. 查阅mysql官方文档仅找到如下描述: 11.10 Using ...

  8. mysql读写分离踩坑记

    解决Lost connection to MySQL server during query错误方法 max_allowed_packet = 500M 配置MySQL允许的最大数据包大小,上面的50 ...

  9. Python单线程爬取QQ空间说说存入MySQL并生成词云(超详细讲解,踩坑经历)

    利用python爬取好友说说并分析 看了网上的许多博客,基本上都是一个样,基本的知识也没详细解释,我这次也想跟大家仔细分析一下,自己还是要有一定爬虫基础,本人技术有限,如果本文哪有错误或不够准确的地方 ...

最新文章

  1. 效率神器!开源快捷启动工具
  2. python链家网高并发异步爬虫and异步存入数据
  3. MySQL 的主从原理和复制过程简述
  4. matlab求系统根轨迹和系统增益,控制系统的根轨迹分析
  5. 错误:java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
  6. 新浪邮箱文件下载php,免费邮箱大全收集-国内篇
  7. 导入项目时遇到的plugin with id com.android.application not found问题解决方案
  8. java实现psd格式图片读入
  9. google广告分类
  10. 2021-08-15nginx访问502,日志报错:connect() to 127.0.0.1:180 failed (13: Permission denied)解决
  11. 杂项多彩_40美丽多彩的博客设计
  12. 微信小程序网络请求异常怎么办_微信小程序网络超时的处理
  13. 如何在百度搜索到自己的网站?新站必看
  14. SCU 4444 Travel 【次完全图最短路】
  15. AutoCAD语言包下载地址
  16. 秦的成功得益于崇拜制度和规则
  17. Linux 系统Apache配置SSL证书
  18. php smarty加载失败,smarty模板无法加载如何解决?
  19. 使用 NSIS 制作软件安装包
  20. 爱国者一体机电脑蓝屏怎么U盘重装系统教学?

热门文章

  1. Linux X Window 与命令行的切换
  2. VTK:vtkSelectPolyData选择多数据用法实战
  3. VTK:重新采样附加的 PolyData用法实战
  4. wxWidgets:wxDataObject概述
  5. boost::multi_index模块相关的测试程序
  6. boost::log::sources::severity_channel_logger_mt用法的测试程序
  7. boost::hana::unique用法的测试程序
  8. GDCM:无效的DICOM文件的测试程序
  9. Boost:转换sqrt的测试程序
  10. Boost:异步操作,涉及重新打包多个操作,但选择仅调用其中一个的测试程序