【MySQL】唯一性约束【UNIQUE】从基础到就业

2023-10-27

唯一约束 【unique】: 用来限制某个字段/某列的值不能重复,唯一约束允许出现 多个空值

同一个表可以有多个唯一约束;唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。 唯一性约束允许列值为空;在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。 你给表创建唯一约束的时候,mysql会默认创建一个唯一索引。

设置了唯一索引的列可以插入 NULL 值,但不允许出现一张表中,某一列,设置了唯一约束,插入两条 NULL 

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名'; #查看都有哪 些约束

 

创建一个表test4的表,将id 设置为 unique

唯一约束可以是某一个列的值唯一

CREATE TABLE test4(
id INT  UNIQUE  ,
`name` VARCHAR (15) ,
salary DECIMAL (10,2),
email VARCHAR(25)

在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同 {列名是 id 约束名也是id }

 

 唯一约束可以是某一个列的值唯一,也可以多个列组合的唯一约束

 CREATE TABLE test6(
id INT ,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
-- 使用表级约束语法
 UNIQUE(NAME,PASSWORD)  # name 和password 两个列共同组合唯一约束 
)  

/*也可以给唯一约束起别名 语法:CONSTRAINT uq_test6  UNIQUE (NAME,PASSWORD)* /
)

 

 测试test4表插入id重复值是否成功

INSERT INTO test4 VALUES(1,'张三','80000','2320761223@qq.com');
INSERT INTO test4 VALUES(1,'王五','60000','3133425745@qq.com');

 提示错误: Duplicate entry '1' for key 'test4.id'   / 键“test4.id”的重复条目“1”

重点一: 但是在多列组合的唯一性约束中,可以插入成功

复合唯一约束:

复合唯一约束就是多列组合唯一约束,这个一个表中分别给多个列设置索引是不一样的,插入数据的效果也是不一样的  ,唯一约束 是表中同一列不许出现重复值,而复合唯一约束,只要在组成复合约束的组合字段有一个字段不同就可以插入,如果将三个字段设置成了复合唯一约束,插入两条数据哪怕有一个不一样都可以插入,插入两条数据 ,如果设置了复合唯一约束的三个字段都出现一样的话,那就要遵守唯一约束的规则不能插入重复值。

一张表中,给多个置唯一索引

 CREATE TABLE test8(
 id  INT UNIQUE , # 列级约束
 last_name VARCHAR(15)UNIQUE,
 salary DECIMAL (10,2),
 email VARCHAR(25)  UNIQUE
 )

一张表中给多个列设置组合索引:

 CREATE TABLE test9(
 id  INT ,
 last_name VARCHAR(15),
 salary DECIMAL (10,2),
 email VARCHAR(25),
 CONSTRAINT uq_test8_id_name_em  UNIQUE(id,last_name,email)

# CONSTRAINT uq_test8_id_name_em 给这个复合约束起了别名'uq_test8_id_name_em'  加不加这段都无所谓  不加的话复合约束的名称就成了 id了 ,详细原理文末讲解。

 )

给test6表的name  插入重复值是否成功 (前提 test6 的唯一约束,是由name 和password 两个列共同组合唯一约束)

 我不是给name 和password 设置了唯一性约束了吗,唯一性约束不是不允许插入重复值吗?

为什么会有两个'王阳', 这是因为前面讲的 多列组合的约束有一个特性,你设置了组合约束包含几列,只有表中出现多列组合约束的所有列值相同时那就会出错插不进去。

给表test 6插入 两条数据相同的数据 不要管 id = 1 因为我没给id设置任何约束它不受影响,主要看name password

INSERT INTO test6 VALUES(1,"张国立","12345");
INSERT INTO test6 VALUES(1,"张国立","12345")

 (2)创建表后还可以添加唯一键约束 

方式1: alter table 表名称 add unique key(字段列表);

方式2: alter table 表名称 modify 字段名 字段类型 unique

新建了一个表 test3 没有添加任何索引

CREATE TABLE test3(
 id  INT  ,
 last_name VARCHAR(15),
 salary DECIMAL (10,2),
 email VARCHAR(25)
 )

用add   和 MODIFY 给字段id 和 emai 分别加上唯一索引

 ALTER TABLE test3 
 ADD UNIQUE KEY(id)

 ALTER TABLE test3 MODIFY email VARCHAR(25) UNIQUE

3. 删除唯一索引:

添加唯一性约束的列上也会自动创建唯一索引。

删除唯一约束只能通过删除唯一索引的方式删除。

删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。

索引名命名规则:

如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;

如果是组合列,那么默认和() 中排在第一个的列名相同。也可以自定义唯一性约束名

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

【MySQL】唯一性约束【UNIQUE】从基础到就业 的相关文章

  • Rails 创建 schema_migrations - Mysql2::Error: 指定的键太长

    我正在使用Rails 3 2 6和Mysql 6 0 9 但我在MySQL 5 2 25上有完全相同的错误 当我创建新数据库时 rake db create 然后当我尝试加载架构时 rake schema load 我收到此错误 Mysql
  • 使用 Coldfusion 分页

    是否可以仅使用一个查询在 Coldfusion 中分页并显示页数 我的理解是 您显然可以使用一个查询进行分页 但您需要一个额外的查询来创建页面 这是为了计算结果总数 currentPage 1 resultsPerPage Offset i
  • 在 MySQL 5.6 中重置 ROOT 密码

    我一直在关注这些说明 http dev mysql com doc refman 5 6 en resetting permissions html用于重置root本地安装的密码MySQL 5 6在 Windows 7 笔记本电脑上 我停止
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE
  • mysql查询先慢后快

    我有 2 个 myISAM 表 分别称为 tests 和 completed tests 一个有 170 个条目 另一个有 118k 条目 当我运行此查询时 SELECT ct archive ct status ct score ct u
  • 如何在SQL中查找单元格中的重复单词

    我有一个名为 situation 和 entityid 的列 Entityid Situation 1234 In the the world of of 3456 Total universe is is a 任何人都可以给我查询以找到这
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • 重用 PDO 语句 var 会使进程崩溃

    我重用一个变量来存储两个不同的 PDO mysql 语句 stmt dbh gt prepare SELECT stmt gt execute stmt dbh gt prepare UPDATE crash here Error in o
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro

随机推荐