-
2021-11-23 10:40:46
背景
把数据库中某一个字段设置成唯一键unique作为限制,那么使用软删除的方法删除掉一条包括这个唯一键的数据时:
我们的需求一般是(软)删除后可以重新添加,那么问题就来了
问题
数据库不知道我是不是软删除,这个字段其他数据也有,那么数据库就会判断插入(编辑)失败(注意:此处是直接抛出异常,可以用try catch去捕捉异常,需要提醒的是mybatis中insert或update语句返回的虽然是int或者是boolean,但是他的内部仍然没有给处理,所以如果使用mybatis的话同样需要手动处理异常)
一般解决思路: 这个时候一般会想到用 这个字段和is_delete 作为唯一字段,好像没啥问题。走下流程,
添加一条新数据 --> 成功
数据这条数据 --> 成功 (is_delete 变为1)
重新添加这条数据–> 成功 ( 字段 + is_delete 0)
删除这条数据 --> 失败 发现和第二步数据重复(唯一约束不允许我们字段相同) 数据库层报错如何正确解决:
两种方案吧
第一种
直接物理删除,但是当遇到一些比较"正常"的需求时,比如说数据备份,或者关键表仍可查询的时候,这种方法就不太明智了。
第二种:
额外维护一个字段del_unique_key,三个字段合在一起作为唯一键,其中del_unique_key初始化默认为0,当删除的时候将这个字段维护为id(uuid)。 重新走一下流程,
思路很简单,重要的是开发的可以考虑到这种问题与否。更多相关内容 -
MySQL 唯一约束
2021-05-15 14:12:35MySQL 唯一约束1 特性2 添加2.1 建表的时候添加唯一约束2.2 利用ALTER ADD 添加唯一约束2.3 利用ALTER MODIFY字段添加唯一约束 1 特性 该约束修饰的字段不能重复 每张表可以存在多个唯一约束 唯一约束的字段可以为...MySQL 唯一约束
1 特性
- 该约束修饰的字段不能重复
- 每张表可以存在多个唯一约束
- 唯一约束的字段可以为空
2 添加
2.1 建表的时候添加唯一约束
1、UNIQUE直接跟在字段后面指定
CREATE TABLE user1 ( id INT, name VARCHAR(20) UNIQUE );
2、UNIQUE在最后指定(单个)
CREATE TABLE user2 ( id INT, name VARCHAR(20), UNIQUE(name) );
3、UNIQUE在最后指定(多个)
CREATE TABLE user3 ( id INT, name VARCHAR(20), UNIQUE(id, name) );
2.2 利用ALTER ADD 添加唯一约束
1、先创建一个没有唯一约束的表
CREATE TABLE user4 ( id INT, name VARCHAR(20) );
2、利用 ALTER ADD 语句添加单个唯一约束
ALTER TABLE user4 ADD UNIQUE(name);
添加完响应字段的Key列的值变为”UNI“
mysql> desc user4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(20) | YES | UNI | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
3、利用 ALTER ADD 语句添加联合唯一约束
ALTER TABLE user4 ADD UNIQUE(id, name);
添加完括号里的第一个字段(这里是Id)的Key列的值变为”MUL“,如果要删除的话,只需要删除Key为”MUL“的字段(即id)即可
mysql> DESC USER4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | MUL | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
2.3 利用ALTER MODIFY字段添加唯一约束
ALTER TABLE user4 MODIFY id INT UNIQUE;
2.4 利用CREATE UNIQUE INDEX创建唯一约束
CREATE UNIQUE INDEX UserIDIndex ON user4 (id);
3 UNIQUE INDEX 的作用
3.1 唯一约束
添加了唯一约束的字段不允许重复。例如在添加了id为1的数据后,再次添加id为1的数据就会报错
# 添加唯一约束 mysql> ALTER TABLE user4 ADD UNIQUE INDEX(ID); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 # 先插入一条id为1,name为Jason的数据 mysql> INSERT INTO user4 (id, name) VALUES (1, 'Jason'); Query OK, 1 row affected (0.00 sec) #再次插入一条id为1,name为Jason的数据时就会报重复输入的错误 mysql> INSERT INTO user4 (id, name) VALUES (1, 'Jason'); ERROR 1062 (23000): Duplicate entry '1' for key 'user4.id'
3.2 联合唯一约束
当多个字段在一起添加了联合唯一约束后,只要联合后的字段不重复即可
#添加一个id name的联合主键 mysql> ALTER TABLE user4 ADD UNIQUE INDEX (id, name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 #插入id为1,name为Jason的数据 mysql> INSERT INTO user4 (id,name) VALUES (1,'Jason'); Query OK, 1 row affected (0.00 sec) #再次插入id为1,name为Jason的数据,与3.1中仅以id为唯一约束的错误提示 #('1' for key 'user4.id')不同的是,这里的错误提示是('1-Jason' for key 'user4.id'), # 可以看到是将id-name作为一个整体来进行唯一性校验的 mysql> INSERT INTO user4 (id,name) VALUES (1,'Jason'); ERROR 1062 (23000): Duplicate entry '1-Jason' for key 'user4.id' #插入id为1,name为Sam的数据(id=1重复) mysql> INSERT INTO user4 (id,name) VALUES (1,'Sam'); Query OK, 1 row affected (0.00 sec) #插入id为2,name为Sam的数据(name=Sam重复) INSERT INTO user4 (id,name) VALUES (2,'Sam'); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM user4; +------+-------+ | id | name | +------+-------+ | 1 | Jason | | 1 | Sam | | 2 | Sam | +------+-------+ 3 rows in set (0.00 sec)
4 删除
4.1 删除匿名唯一索引-删除约束字段
如以下方式创建的匿名唯一约束,直接用ALTER DROP 的方式删除唯一索引,若是联合唯一索引,则删除表中Key列的值为”MUL“的字段名即可。
#单独的唯一索引 mysql> ALTER TABLE user4 ADD UNIQUE INDEX(name); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC user4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(20) | YES | UNI | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE user4 DROP INDEX name; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 #联合唯一索引 mysql> ALTER TABLE user4 ADD UNIQUE INDEX (id, name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC User4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | MUL | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE user4 DROP INDEX id; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
4.2 删除具名唯一索引-删除索引名称
#单个 mysql> ALTER TABLE user4 ADD UNIQUE INDEX `NameIndex` (name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC user4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(20) | YES | UNI | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE user4 DROP INDEX `NameIndex`; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 #联合 mysql> ALTER TABLE user4 ADD UNIQUE INDEX `IdNameIndex` (id,name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC user4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | MUL | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE user4 DROP INDEX `IdNameIndex`; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
-
MYSQL 唯一约束
2022-05-29 14:27:37MYSQL 唯一约束一、唯一约束(UNIQUE)
唯一约束用来保证一列(或一组列)中的数据是唯一的。类似与主键,但是有以下区别:
- 表可包含多个唯一约束,但每个表只允许一个主键。
- 唯一约束列可包含 NULL 值。
- 唯一约束列可修改或更新。
- 唯一约束列的值可重复使用。
- 唯一约束不能用来定义外键。
二、创建唯一约束
1、 定义表中单列的唯一约束
CREATE TABLE Employees ( social_num INTEGER UNIQUE ); -- 给表的 social_num 列定义添加关键字 UNIQUE,使其成为唯一约束。如果在 social_num 列中插入或更新导致重复值的值,MySQL将发出错误消息并拒绝更改
2、定义表的唯一约束(单列)
CREATE TABLE Employees ( employee_name CHAR(50) NOT NULL, social_num INTEGER, phone INTEGER, UNIQUE (social_num) ); -- 如果在 social_num 列中插入或更新导致重复值的值,MySQL将发出错误消息并拒绝更改
3、定义表的唯一约束(多列联合)
CREATE TABLE Employees ( employee_name CHAR(50) NOT NULL, social_num INTEGER, phone INTEGER, UNIQUE (employee_name, social_num) ); -- 要求两个字段联合起来时唯一的,即employee_name + social_num 是唯一的
4、使用CONSTRAINT语法定义唯一约束(可指定约束名)
(1)创建表时定义
-- 创建表时定义 CREATE TABLE Employees ( employee_name CHAR(50) NOT NULL, social_num INTEGER, phone INTEGER UNIQUE, employee_address CHAR(255), CONSTRAINT name_address UNIQUE (employee_name, employee_address) ); -- 插入数据 INSERT INTO Employees(employee_name, employee_address) VALUES('a', 'NJ');
- 第一个UNIQUE约束应用于phone列,表示每个雇员必须具有不同的电话号码
- 第二个UNIQUE约束名称为name_address,表示雇员employee_name可以重复,employee_address可以重复,但employee_name+employee_address必须唯一不可重复。例:a + NJ 和 a + SH ✔
a + NJ 和 b + NJ ✔
a + NJ 和 b + SH ✔
a + NJ 和 a + NJ ❌ 报错“1062 - Duplicate entry”
(2) 在已创建好的表上加唯一约束
-- 在已创建好的表上加唯一约束,指定约束名为uni_name ALTER TABLE Employees ADD CONSTRAINT uni_name UNIQUE (employee_name); -- 在已创建好的表上加唯一约束,不指定约束名 ALTER TABLE Employees ADD UNIQUE (employee_name);
三、删除唯一约束
添加唯一约束时,MySQL将为数据库创建一个相应的 BTREE 索引,所以删除索引即可删除约束。通过如下命令查询索引:
SHOW INDEX FROM 表名;
-- 格式一: DROP INDEX 约束名 ON 表名; -- 例如: DROP INDEX name_address ON Employees; -- 格式二: ALTER TABLE 表名 DROP INDEX 约束名; -- 例如: ALTER TABLE Employees DROP INDEX name_address;
参考学习链接:
mysql联合唯一约束_MySQL中添加唯一约束和联合唯一约束 - 百度文库
-
MySQL唯一约束(UNIQUE KEY)
2021-05-16 00:27:42MySQL唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能...MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。
唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。在创建表时设置唯一约束
唯一约束可以在创建表时直接设置,通常设置在除了主键以外的其它列上。
在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法格式如下:<字段名> <数据类型> 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)
删除唯一约束
在 MySQL 中删除唯一约束的语法格式如下:
ALTER TABLE <表名> DROP INDEX <唯一约束名>;
例 3
删除数据表 tb_dept1 中的唯一约束 unique_name,SQL 语句和运行结果如下所示。
mysql> ALTER TABLE tb_dept1 -> DROP INDEX unique_name; Query OK, 0 rows affected (0.20 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 | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
-
mysql唯一约束特点是不能重复允许为null
2021-09-05 20:20:21mysql唯一约束特点是不能重复允许为null 参考网址: https://mp.weixin.qq.com/s/hmro3mAmEWDgpanH3DsPpQ 测试建表脚本 建表脚本 -- 唯一索引(不设置not null) create table demo1( id int unsigned primary key ... -
mysql 唯一约束
2019-01-18 11:28:321,添加唯一约束 ALTER TABLE table_name ADD UNIQUE(字段A); 2,删除约束 DROP INDEX key_name ON table_name; 3,查看表键 SHOW KEYS FROM table_name; -
JAVA 处理Mysql唯一约束,将异常信息自定义处理,返回给前端
2020-06-02 10:19:27有时候在数据库表中,对某列设置了唯一约束, 在对某条数据,进行修改或者新增时候,程序中会抛出异常:SQLIntegrityConstraintViolationException简单处理: try { //修改or新增sql }catch (Exception e){ ... -
MySQL中的唯一性约束与NULL详解
2020-09-09 16:56:36里记录的是很久之前的一个 bug 了,主要给大家介绍了关于MySQL中唯一性约束与NULL的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。 -
mysql多字段唯一约束
2021-01-19 04:42:05MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。在创建表时设置唯一约束在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法规则如下: ... -
Mysql 唯一性约束添加
2021-01-18 18:25:09一、单列唯一约束在一列上添加唯一约束,主要是让该列在表中只能有唯一的一行,例如注册邮箱时的邮箱名、手机号等信息,相关操作如下:1.建表时加上唯一性约束:CREATE TABLE `t_user` (`Id` int(11) NOT NULL AUTO_... -
MySQL中添加唯一约束和联合唯一约束
2021-01-19 06:17:13在MySQL数据库中,经常会碰到由于业务需要添加唯一键约束,唯一键约束,可以在一个列上添加约束,也可以在多个列上添加唯一约束。一、单列唯一约束在一列上添加唯一约束,主要是让该列在表中只能有唯一的一行,例如... -
mysql怎么添加唯一约束?
2021-01-19 21:38:54MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现... -
MySQL约束(主键,唯一,非空,外键)
2020-12-14 13:46:363. 唯一约束:unique 4. 外键约束:foreign key 目录MySQL约束(主键,唯一,非空,外键)1. 非空约束2. 唯一约束3. 主键约束4. 外键约束例子 1. 非空约束 非空约束是为了让数据在存入数据时,保证值不为null。 ... -
MySQL之主键约束、非空约束、唯一约束
2022-03-03 09:12:59今天来看看MySQL其中三种约束。 约束的作用: 对表中的数据进行限制,保证数据的正确性、有效性、完整性。违反约束的不正确数据,将无法插入到表中。今天先看三种: 1、主键 primary key 2、非空 not null 3、... -
MySQL主键约束和唯一性约束
2021-01-19 09:04:25MySQL主键约束和唯一性约束都是索引,它们的...即可以重复加入含有NULL的记录,主键字段不能为NULLmysql-workbench无法创建多字段唯一性约束,可以在命令行手工增加增加多字段唯一性性约束mysql>alter table c... -
MySQL字段唯一性约束与唯一索引
2021-09-03 08:28:39唯一约束和唯一索引,都可以实现数据列的唯一性,列值可以为null(允许存在多个null值) 创建唯一性约束,会自动创建一个同名的唯一索引,这个索引不能够单独删除,删除唯一约束会自动删除索引。唯一约束是通过唯一... -
MySQL||唯一约束(Unique Key)和非空约束(NOT NULL)
2021-01-21 06:23:26唯一约束MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。非空约束MySQL非空约束(NOT NULL)可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。在... -
MySQL中的主键约束和唯一性约束区别
2021-12-09 21:23:48主键约束 primary key 主键约束时唯一的表示表中的每一条...可以把唯一性约束放在一个或者多个列上 这些列或者列的组合必须是唯一性的 唯一性约束所在的列并不是表的主键列 唯一性约束强制在指定的列上创建一个唯一性索 -
【MySQL笔记】唯一性约束(UNIQUE)
2022-05-14 00:54:23唯一性约束的使用 作用 关键字 特点 添加唯一性约束 建表时添加 修改表时添加 删除唯一性约束 查看表的索引 删除唯一性约束 唯一性约束的使用 作用 用来限制某个字段 / 某列的值不能重复 关键字 ... -
唯一性约束 [MySQL][数据库]
2022-03-18 00:28:56唯一性约束(UNIQUE) 唯一性约束的作用: 用来限制某个字段的值不能重复(但是可以有多个null) 唯一性约束的特点: 同一个表可以有多个唯一性约束 唯一性约束可以是某一个列的值...MySQL会在加了唯一性约束的列上默认创建 -
mysql多列指定唯一约束
2021-01-18 22:21:40demo如何为MySQL中的多列指定唯一约束?MySQL SQL Server 拉丁的传说 2019-06-03 10:25:56如何为MySQL中的多列指定唯一约束?我有张桌子:table votes (id,user,email,address,primary key(id),);现在我想让列用户,... -
如何为MySQL中的多列指定唯一约束?
2021-01-19 10:00:00如何为MySQL中的多列指定唯一约束?我有一张桌子:table votes (id,user,email,address,primary key(id),);现在我想使列用户,电子邮件,地址唯一(一起)。我如何在MySql中执行此操作?当然这个例子只是......一个...