精华内容
下载资源
问答
  • mysql唯一约束
    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:35
    MySQL 唯一约束1 特性2 添加2.1 建表的时候添加唯一约束2.2 利用ALTER ADD 添加唯一约束2.3 利用ALTER MODIFY字段添加唯一约束 1 特性 该约束修饰的字段不能重复 每张表可以存在多个唯一约束 唯一约束的字段可以为...


    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:37
    MYSQL 唯一约束

    一、唯一约束(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唯一约束 -MySQL教程™

     

     

    展开全文
  • MySQL唯一约束(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 参考网址: https://mp.weixin.qq.com/s/hmro3mAmEWDgpanH3DsPpQ 测试建表脚本 建表脚本 -- 唯一索引(不设置not null) create table demo1( id int unsigned primary key ...
  • mysql 唯一约束

    千次阅读 2019-01-18 11:28:32
    1,添加唯一约束 ALTER TABLE table_name ADD UNIQUE(字段A); 2,删除约束 DROP INDEX key_name ON table_name; 3,查看表键 SHOW KEYS FROM table_name;
  • 有时候在数据库表中,对某列设置了唯一约束, 在对某条数据,进行修改或者新增时候,程序中会抛出异常:SQLIntegrityConstraintViolationException简单处理: try { //修改or新增sql }catch (Exception e){ ...
  • 里记录的是很久之前的一个 bug 了,主要给大家介绍了关于MySQL唯一约束与NULL的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
  • mysql多字段唯一约束

    千次阅读 2021-01-19 04:42:05
    MySQL唯一约束(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:54
    MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现...
  • 3. 唯一约束:unique 4. 外键约束:foreign key 目录MySQL约束(主键,唯一,非空,外键)1. 非空约束2. 唯一约束3. 主键约束4. 外键约束例子 1. 非空约束 非空约束是为了让数据在存入数据时,保证值不为null。 ...
  • 今天来看看MySQL其中三种约束约束的作用: 对表中的数据进行限制,保证数据的正确性、有效性、完整性。违反约束的不正确数据,将无法插入到表中。今天先看三种: 1、主键 primary key 2、非空 not null 3、...
  • MySQL主键约束唯一约束

    千次阅读 2021-01-19 09:04:25
    MySQL主键约束唯一约束都是索引,它们的...即可以重复加入含有NULL的记录,主键字段不能为NULLmysql-workbench无法创建多字段唯一约束,可以在命令行手工增加增加多字段唯一性性约束mysql>alter table c...
  • MySQL字段唯一约束唯一索引

    千次阅读 2021-09-03 08:28:39
    唯一约束和唯一索引,都可以实现数据列的唯一性,列值可以为null(允许存在多个null值) 创建唯一性约束,会自动创建一个同名的唯一索引,这个索引不能够单独删除,删除唯一约束会自动删除索引。唯一约束是通过唯一...
  • 唯一约束MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。非空约束MySQL非空约束(NOT NULL)可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。在...
  • 主键约束 primary key 主键约束唯一的表示表中的每一条...可以把唯一约束放在一个或者多个列上 这些列或者列的组合必须是唯一性的 唯一约束所在的列并不是表的主键列 唯一约束强制在指定的列上创建一个唯一性索
  • 唯一约束的使用 作用 关键字 特点 添加唯一约束 建表时添加 修改表时添加 删除唯一约束 查看表的索引 删除唯一约束 唯一约束的使用 作用 用来限制某个字段 / 某列的值不能重复 关键字 ...
  • 唯一约束 [MySQL][数据库]

    千次阅读 2022-03-18 00:28:56
    唯一约束(UNIQUE) 唯一约束的作用: 用来限制某个字段的值不能重复(但是可以有多个null) 唯一约束的特点: 同一个表可以有多个唯一约束 唯一约束可以是某一个列的值...MySQL会在加了唯一约束的列上默认创建
  • demo如何为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中执行此操作?当然这个例子只是......一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,440
精华内容 37,376
关键字:

mysql唯一约束

mysql 订阅