-
2021-01-27 20:54:06
约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。
索引 数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种分散的数据结构。可以把索引类比成书的目录,有目录的肯定比没有目录的书,更方便查找。
唯一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束允许为 NULL,只是只能有一行。
唯一索引 不允许具有索引值相同的行,从而禁止重复的索引或键值。
唯一约束和唯一索引都是为了保证表中被限制的字段不允许有重复的值,看起来功能是一样的,那为什么要设计这样两种一样的功能呢?
首先创建两个字段值一样的表 t1,t2,并为 t1 表中的 col1 列设置唯一约束。
CREATE TABLE t1 (
col1 INT(11),
col2 VARCHAR(20),
CONSTRAINT t1_uq UNIQUE (col1)
);
CREATE TABLE t2 (
col1 INT(11),
col2 VARCHAR(20)
);
然后为表 t2 表中的 col1 列设置唯一索引
CREATE UNIQUE INDEX
t2_idx ON t2 (col1);
创建表 t3,并将 t1 表中的 col1 列设置为 t3 表中 col2 列的外键
CREATE TABLE t3 (
col1 INT(11),
col2 INT(11),
col3 VARCHAR(20),
CONSTRAINT t3_fk FOREIGN KEY (col2) REFERENCES t1 (col1)
);
到此为止,基本上就能得出,唯一约束和唯一索引在 MySQL 数据库里区别了
概念上不同,约束是为了保证数据的完整性,索引是为了辅助查询;
创建唯一约束时,会自动的创建唯一索引;
在理论上,不一样,在实际使用时,基本没有区别。
关于第二条,MySQL 中唯一约束是通过唯一索引实现的,为了保证没有重复值,在插入新记录时会再检索一遍,怎样检索快,当然是建索引了,所以,在创建唯一约束的时候就创建了唯一索引。
4.唯一性索引
如果确定某个数据列只包含彼此各不相同的值,在为这个数据列创建索引的时候,就应该用关键字UNIQUE把它定义为一个唯一索引,Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个记录的这个字段里出现过了。如果是,mysql将拒绝插入那条新纪录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复
5.索引的优点
5.1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性
5.2.建立索引可以大大提高检索的数据,以及减少表的检索行数
5.3.在表连接的连接条件,可以加速表与表直接的相连
5.4.在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库的记录会重新排序)
5.5.建立索引,在查询中使用索引,可以提高性能。
CREATE TABLE parent(2
3id INT NOT NULL,4
5PRIMARY KEY (id)6
7 ) TYPE=INNODB;8
9CREATE TABLE child(10
11id INT, parent_id INT,12
13INDEX par_ind (parent_id),14
15FOREIGN KEY (parent_id) REFERENCES parent(id)16
17ON DELETE CASCADE18
19 ) TYPE=INNODB;
如下是一个更复杂的例子,其中一个product_order表对其它两个表有外键。一个外键引用一个product表中的双列索引。另一个引用在customer表中的单行索引:
1 CREATE TABLE product ( 2 3 category INT NOT NULL, 4 5 id INT NOT NULL, 6 7 price DECIMAL, 8 9 PRIMARY KEY(category, id)10 11 ) TYPE=INNODB;12 13 CREATE TABLE customer (id INT NOT NULL,14 15 PRIMARY KEY (id)16 17 ) TYPE=INNODB;18
19 CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,20 21 product_category INT NOT NULL,22 23 product_id INT NOT NULL,24 25 customer_id INT NOT NULL,26 27 PRIMARY KEY(no), 28 29 INDEX (product_category, product_id),30 31 FOREIGN KEY (product_category, product_id) 32 33 REFERENCES product(category, id)34 35 ON UPDATE CASCADE ON DELETE RESTRICT,36 37 INDEX (customer_id), 38 39 FOREIGN KEY (customer_id)4041 REFERENCES customer(id)42 43 ) TYPE=INNODB;
更多相关内容 -
使用PHP uniqid函数生成唯一ID
2020-10-23 07:43:36生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID。由于生成唯一ID与微秒时间关联,因此ID的唯一性非常可靠 -
Python通用唯一标识符uuid模块使用案例
2020-12-17 01:10:451. 背景知识: UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在... 为什么要使用UUID? 很多应用场景需要一个id, 但是又不要求这个id 有具体的意义, 仅仅用来标识一个对象. -
实现记录唯一性——-用健实现
2020-12-14 11:07:331、用健实现 2、创建唯一索引 3、用序列生成唯一索引 健能够唯一区分数据表中的每个记录的属性或者属性组合,因此使用健可以保证记录的唯一性。 当为表指定primary key 约束时,oricle通过为主键列创建唯一索引... -
MySQL批量插入遇上唯一索引避免方法
2020-12-15 14:40:59以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表分区实战。 今天我们来了解MySQL唯一索引的一些... -
Python用UUID库生成唯一ID的方法示例
2020-12-24 22:33:53UUID介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表示。...可以保证全球范围内的唯一性,但MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC。 uuid2()——基于分布式计算环境DCE(Pytho -
MongoDB中唯一索引(Unique)的那些事
2021-01-19 22:55:36写在前面 MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,...我们用的是MongoDB数据存储用户信息,用户表中曾经用户注册是通过手机号注册的,所以很理所当然的给手机号加上了唯一索引(Unique) -
Javascript生成全局唯一标识符(GUID,UUID)的方法
2020-10-22 19:07:04本文给大家汇总介绍了5种使用javascript实现全局唯一标识符(GUID,UUID)的方法,非常的全面,有需要的小伙伴可以来参考下 -
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2020-10-19 15:10:27本文分为jsp代码和后台代码给大家介绍了基于jQuery实现的Ajax 验证用户名唯一性,非常不错,具有参考借鉴价值,需要的的朋友参考下吧 -
Python使用uuid库生成唯一标识ID
2020-09-17 23:24:51主要介绍了Python使用uuid模块生成唯一标识ID,需要的朋友可以参考下 -
3种php生成唯一id的方法
2020-12-19 00:45:54小编在网上查了许多关于php生成唯一id方法的文章,发现有很多的方法,特整理本文与大家分享php生成唯一...如需生成绝对唯一的 ID,请使用 md5() 函数”。 下面方法返回结果类似:5DDB650F-4389-F4A9-A100-501EF1348872 -
Android10获取唯一ID最佳做法
2021-01-03 22:35:15对于实例 ID 不实用的情况,您还可以使用自定义全局唯一 ID (GUID) 对应用实例进行唯一标识。最简单的方式是使用以下代码生成您自己的 GUID。 1.Kotlin写法 var uniqueID = UUID.randomUUID().toString() 2.Java... -
只要单片机具有真正唯一ID,就可以让加密坚不可摧
2020-08-03 02:26:30现在有不少量产编程器都支持根据唯一ID变换一些数据写入指定地址,甚至支持自己编写变换插件,每个单片机的程序都不一样是完全可以做到的。 -
php 根据自增id创建唯一编号类
2020-10-20 01:30:35本文主要介绍了php根据自增id创建唯一编号类的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧 -
vue-unique-id:Vue.js的组件和HTML唯一ID生成插件
2021-05-06 20:37:18这解决了在创建可重复使用的Vue组件时可为DOM元素生成唯一HTML ID的问题,该组件可在页面中多次实例化。 。 另外,此插件还会为每个Vue.js组件生成一个唯一的id属性(默认情况下为uid )。 该插件没有外部依赖性。... -
mysql怎么添加唯一约束?
2021-02-02 04:53:182、修改表时,使用“ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE(列名);”语句来添加。MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id ...方法:1、创建表时,使用“CREATE TABLE 表名(字段名 数据类型 UNIQUE);”语句来添加;2、修改表时,使用“ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE(列名);”语句来添加。
MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。
唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。
在创建表时设置唯一约束
唯一约束可以在创建表时直接设置,通常设置在除了主键以外的其它列上。
在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法格式如下:CREATE TABLE ( UNIQUE);
例 1
创建数据表 tb_dept2,指定部门的名称唯一,SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) UNIQUE,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_dept2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(40) | YES | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.08 sec)
在修改表时添加唯一约束
在修改表时添加唯一约束的语法格式为:ALTER TABLE ADD CONSTRAINT UNIQUE();
例 2
修改数据表 tb_dept1,指定部门的名称唯一,SQL 语句和运行结果如下所示。mysql> ALTER TABLE tb_dept1
-> ADD CONSTRAINT unique_name UNIQUE(name);
Query OK, 0 rows affected (0.63 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
-
vue-unique-id-生成唯一的组件ID和组件范围HTML ID。-Vue.js开发
2021-05-27 22:33:43这解决了在创建可重复使用的Vue组件(可在页面中多次实例化)时为DOM元素生成唯一HTML ID的问题。 另外,此插件还会为每个Vue.js组件生成一个唯一的id属性(默认情况下为uid)。 该插件没有外部依赖性。 通过npm安装... -
唯一可译码python实现
2018-04-26 12:39:55惟一可译码的判断使用python实现,使用的是信息论与编码的判断算法,Fi,Fi+1前后缀判断算法实现 -
PHP随机生成唯一HASH值自定义函数
2021-01-20 00:50:52一个项目要用到hash值,就去网上找了找,却发现PHP有一个函数能直接生成唯一字符串——uniqid(),通过使用这个函数,再加上自己生成的随机数(防止被破解),更具有唯一性且不易被猜解。主要考虑问题如下: 1、随机... -
唯一可译码的辨别 C语言实现
2017-05-10 19:33:24唯一可译码的辨别 C语言实现,因为用的动态分配,所以编码的长度基本可以无限长 -
数独游戏,随机生成只有唯一解的数独表
2020-11-21 14:48:57用c#写了一个能够随机生成唯一解的数独游戏,很多其他人的都不是随机生成,而且也不能保证生成的数独表的解是唯一的,所以我自己写了一个可以随机生成唯一解的数独游戏,上传上来和大家一起学习学习,看看算法还有... -
MySQL中的唯一索引的简单学习教程
2020-12-15 10:27:48mysql 唯一索引UNIQUE一般用于不重复数据字段了我们经常会在数据表中的id设置为唯一索引UNIQUE,下面我来介绍如何在mysql中使用唯一索引UNIQUE吧。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现... -
MySQL批量插入和唯一索引问题的解决方法
2020-09-09 04:33:03主要给大家介绍了关于MySQL批量插入和唯一索引问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 -
使用redis生成唯一编号
2021-11-29 20:00:43在项目开发中,我们需要保证数据的唯一性,就目前开发中常用的方式有使用自增序列、GUID、时间戳以及时间戳加上随机数。生成ID的方法有很多,每种适用场景、需求以及性能要求不同。下面我们列出以下较为常用的生成ID...在项目开发中,我们需要保证数据的唯一性,就目前开发中常用的方式有使用自增序列、GUID、时间戳以及时间戳加上随机数。生成ID的方法有很多,每种适用场景、需求以及性能要求不同。下面我们列出以下较为常用的生成ID的方式,并且来讨论以下他们的优缺点。
- 利用数据库自带的自增功能设置唯一id:
- 优点:可控并且显而易见。
- 缺点:对于单库单表来说数据库压力大,对于单库多表来说,id并不是全库唯一。
- 利用GUID:
生成GUID是长度为32的16进制字符串,如果转换为byte数组则一共有16个byte元素,也就是说GUID是一个128bit长的数字。
- 优点:减轻了数据库的压力。
- 缺点:对于需要排序来说,我们无法使用id排序。
TIP:目前有类似GUID的方式,但是大多数都是把时间拼接上去,但是这样就造成了id特别长。
- 自定义ID:
目前推特使用的是自己开发的全局唯一ID生成服务Snowflake。它是由精确到毫秒的41位时间序列和10位机器标识以及12位的计数顺序号组成的,它的最高位是符号位并且始终为0。
- 优点:高性能、低延迟、可以按时间排序。
- 缺点:需要独立开发和部署。
- Redis生成id:
对于大型系统来说,我们可以使用Redis来生成ID,主要是依赖于redis是单线程的,因此可以用来生成全局唯一ID。要实现这个功能我们可以用redis的原子操作INCR和INCRBY来实现。下面我们就来看一下如何使用redis生成唯一ID,主要思想是利用redis单线程特性以保证操作的原子性,这样读写同一key时不会出现不同的数据。代码如下:
- 首先我们先利用DequeueItemFromList方法循环获取编号GetForeachNumbers,
private string GetForeachNumbers(IRedisClient redisClent, ShortNumberType type, int count = 5) { var number = string.Empty; var key = string.Format(CacheKeys.ComShortNumberList, type); for (var i = 0; i < count; i++) { number = redisClent.DequeueItemFromList(key); if (string.IsNullOrWhiteSpace(number) || string.IsNullOrEmpty(number)) { if (!RedisUpload(type, true)) { Thread.Sleep(500); } } else { break; } } return number; }
- 然后使用redis上传序列
public bool RedisUpload(ShortNumberType type, bool autoInsert) { var result = false; var key = string.Format(CacheKeys.ComShortNumberList, type); using (var redisClent = RedisManager.GetClient()) { if (redisClent.GetListCount(key) <= RedisMinCount) { var lockKey = "comShortNumber" + type; string token; if (RedisManager.Lock(lockKey, out token, 1500)) { try { var list = GetListForRedis(type); //存储量不足,自动新增 if (list.Count < RedisUploadCount && autoInsert && AutoInsertList(type)) { list = GetListForRedis(type); } if (list.Any()) { var ids = list.Select(x => x.Id).ToList(); var numbers = list.Select(x => x.Number).ToList(); UpdateListByStatu(ids, ShortNumberStatus.handleIng); redisClent.AddRangeToList(key, numbers.OrderByDescending(x => x).ToList()); UpdateListByStatu(ids, ShortNumberStatus.Finished); } } finally { RedisManager.DelLock(lockKey, token); } result = true; } } else result = true; } return result; }
- 最后获取编号
public string GetNumber(ShortNumberType type) { using (var redisClent = RedisManager.GetClient()) { return GetForeachNumbers(redisClent, type); } }
-
php生成唯一数字id的方法汇总
2020-10-23 07:26:08我们在平时的项目中,经常会遇到要使用php生成唯一数字id的环境,网上查了很多资料,其实还是有一定的可能性重复的,所以今天在这里分享下,个人最近研究这个问题的所得。 -
生成唯一优惠码程序,均不重复
2020-06-12 16:56:49该压缩包内含唯一码生成程序,以及已经生成好的可直接使用的唯一码(SQL),所有码均不重复,保证唯一,程序为PHP写的,生成为MySQL的SQL文件,可直接导入使用!