-
2019-06-05 13:40:58
原创-转载请注明出处
问题描述
Mysql表A里的字段Name(类型为Varchar),设置了Unique约束。
如果表里已经存在Name为"a"的记录时,如果此时再insert一条Name为“a ”的数据时,数据库就汇报duplicate的错。
在数据库中检查发现
select * from table where name = "a";
select * from table where name = "a ";
检索出来的结果竟然是一样的!都是"a"这条记录。
错误分析
因为在Mysql中,Varchar在进行字符串比较时,会去掉空格,所以“a”和“a ”在select的时候都视为"a"。
解决方法
将Name字段的类型改为Varbinary
结论
Varchar 在查询的时候会去掉最右边的空格,因此在进行字符串比较时,只保留了除最右边的空格剩下的字节。
Varbinary在查询的时候也不会丢弃任何字节,在比较的时候,所有的字节都是有效的。
遇到这个问题的时候,首先想到的是修改unique约束,但是网上全部都是要修改就删掉约束重建的(我也是试着删了重建,但很莫名的删不掉?不得不另寻方法)。相信也有人遇到类似的问题,但至少我没有找到一个真的好好解决问题的文章。
如果文章中有什么不对的不全的还望指出。
更多相关内容 -
mysql unique key在查询中的使用与相关问题
2021-01-19 22:59:481、建表语句: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, ... UNIQUE KEY `idxunique_first_name_gender` (`first_name` -
MySQL UNIQUE索引
2021-01-18 21:52:58在本教程中,您将学习如何使用MySQL UNIQUE索引来防止表中一个或多个列中拥有重复的值。MySQL UNIQUE索引简介要强制执行一个或多个列的唯一性值,我们经常使用PRIMARY KEY约束。但是,每个表只有一个主键。 如果要...在本教程中,您将学习如何使用MySQL UNIQUE索引来防止表中一个或多个列中拥有重复的值。
MySQL UNIQUE索引简介
要强制执行一个或多个列的唯一性值,我们经常使用PRIMARY KEY约束。
但是,每个表只有一个主键。 如果要使用多个列或一组具有唯一值的列,则不能使用主键约束。
幸运的是,MySQL提供了另一种称为UNIQUE索引的索引,它允许您在一个或多个列中强制实现值的唯一性。 与PRIMARY KEY索引不同,每个表可以有多个UNIQUE索引。
要创建一个UNIQUE索引,请使用CREATE UNIQUE INDEX语句如下:
CREATE UNIQUE INDEX index_name
ON table_name(index_column_1,index_column_2,...);
在一个或多个列中强制实现值的唯一性的另一种方法是使用唯一约束。创建唯一约束时,MySQL会在幕后创建一个UNIQUE的索引。
以下语句说明了如何在创建表时创建唯一约束。
CREATE TABLE table_name(
...
UNIQUE KEY(index_column_,index_column_2,...)
);
也可以使用UNIQUE INDEX而不是UNIQUE KEY。 它们被称为相同的东西。
如果要向现有表添加唯一约束,可以使用ALTER TABLE语句,如下所示:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);
MySQL UNIQUE索引和NULL
与其他数据库系统不同,MySQL将NULL值视为不同的值。 因此,您可以在UNIQUE索引中具有多个NULL值。
这就是MySQL的设计方式。 这不是一个错误,即使它被报告为一个错误。
另一重要的一点是UNIQUE约束不适用于除了BDB存储引擎之外的NULL值。
MySQL UNIQUE索引示例
假设想在应用程序中管理联系人。还希望contacts表中的email列必须是唯一的。
要执行此规则,请在CREATE TABLE语句中创建唯一的约束,如下所示:
USE testdb;
CREATE TABLE IF NOT EXISTS contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
phone VARCHAR(15) NOT NULL,
email VARCHAR(100) NOT NULL,
UNIQUE KEY unique_email (email)
);
如果使用SHOW INDEXES语句,将看到MySQL为email列创建了一个UNIQUE索引。
SHOW INDEXES FROM contacts;
+----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| contacts | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| contacts | 0 | unique_email | 1 | email | A | 0 | NULL | NULL | | BTREE | | |
+----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set
接下来,向contacts表中插入一行。
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-999-9988','max.su@yiibai.com');
现在,如果您尝试插入电子邮件是
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-999-9988','max.su@yiibai.com');
执行上面语句后,应该会看到以下结果 -
1062 - Duplicate entry 'max.su@yiibai.com' for key 'unique_email'
假设您不仅希望电子邮件是唯一的,而且first_name,last_name和phone的组合也是唯一的。 在这种情况下,可以使用CREATE INDEX语句为这些列创建一个UNIQUE索引,如下所示:
CREATE UNIQUE INDEX idx_name_phone
ON contacts(first_name,last_name,phone);
将以下行添加到contacts表中会导致错误,因为first_name,last_name和phone的组合已存在。
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-999-9988','john.d@yiibai.com');
执行上面语句后,应该会看到以下结果 -
1062 - Duplicate entry 'Max-Su-(+86)-999-9988' for key 'idx_name_phone'
可以看到,不可以将重复电话号码插入到表中。
在本教程中,您已经学习了如何使用MySQL UNIQUE索引来防止数据库中的重复值。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
-
MySQL使用UNIQUE实现数据不重复插入
2020-12-15 22:16:44SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录。 UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 拥有自动定义的 UNIQUE 约束。 请注意,每个表可以有多个 UNIQUE ... -
Mysql中 unique列插入重复值该怎么解决呢
2020-12-15 17:41:58当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。 mysql> create table ... -
什么是MySQL UNIQUE约束,我们如何将其应用于表的字段?
2021-02-02 03:44:30顾名思义,MySQL UNIQUE约束保持表中列的唯一性,并且不允许插入重复值。基本上,UNIQUE约束创建索引,以使索引列中的所有值必须唯一。此处需要提及的是,我们在一个MySQL表中可以有多个UNIQUE列。我们可以通过在...顾名思义,MySQL UNIQUE约束保持表中列的唯一性,并且不允许插入重复值。基本上,UNIQUE约束创建索引,以使索引列中的所有值必须唯一。此处需要提及的是,我们在一个MySQL表中可以有多个UNIQUE列。
我们可以通过在定义列时提及'UNIQUE'关键字来应用UNIQUE约束。通过以下示例可以理解-mysql> Create table test3(ID INT UNIQUE, Name Varchar(20));
上面的查询创建一个名为“ test3”的表,该表上具有“ UNIQUE”约束的列“ ID”。我们可以使用DESCRIBE语句检查它,如下所示:mysql> DESCRIBE test3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ID | int(11) | YES | UNI | NULL | |
| Name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
UNIQUE约束也可以通过以下查询应用于表的列-mysql> Create table test4(ID INT, Name Varchar(20),UNIQUE(ID));
我们可以使用DESCRIBE语句检查它,如下所示:mysql> DESCRIBE test4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ID | int(11) | YES | UNI | NULL | |
| Name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
-
mysql unique index 允许为null
2020-11-07 00:56:11最近遇到个问题是关于mysql 数据库 unique key 唯一约束索引添加的问题。 问题场景: 根据业务需要给数据库表添加一个多字段联合唯一索引 unique index。使用表的phone, shop_code 字段关联创建。 其中表phone字段...最近遇到个问题是关于mysql 数据库 unique key 唯一约束索引添加的问题。
问题场景:
根据业务需要给数据库表添加一个多字段联合唯一索引 unique index。使用表的phone, shop_code 字段关联创建。
其中表phone字段允许null,默认为null。操作:
使用sql执行脚本执行添加索引sql。执行时报错。提示有创建唯一约束字段存在重复值。
排查问题:
SELECT COUNT(DISTINCT `phone`, `shop_code`) from customer;
1. 使用该sql查询需要创建unique index 的字段的过滤重复总数是否 等于 count(*) 全表总数。发现不相等,脚本报错。查看数据,发现phone值存在大量为null的数据。
2. 然后查询mysql使用手册,官方设定mysql 的 unique索引时允许包含多个null值。
以下时官方在常见unique的文档的解释,大意是说:唯一索引 创建一个UNIQUE索引时,创建字段的值必须不能重复。但是一个UNIQUE 索引,可以包含NULL值
原文:
Unique Indexes A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. If you specify a prefix value for a column in a UNIQUE index, the column values must be unique within the prefix length. A UNIQUE index permits multiple NULL values for columns that can contain NULL. If a table has a PRIMARY KEY or UNIQUE NOT NULL index that consists of a single column that has an integer type, you can use _rowid to refer to the indexed column in SELECT statements, as follows: _rowid refers to the PRIMARY KEY column if there is a PRIMARY KEY consisting of a single integer column. If there is a PRIMARY KEY but it does not consist of a single integer column, _rowid cannot be used. Otherwise, _rowid refers to the column in the first UNIQUE NOT NULL index if that index consists of a single integer column. If the first UNIQUE NOT NULL index does not consist of a single integer column, _rowid cannot be used.
官方文档连接: https://dev.mysql.com/doc/refman/5.6/en/create-index.html.
得到结论,mysql 唯一索引是支持多个null值存在的。
解决:
修复脚本的重复数据校验逻辑,过滤空值。
SELECT COUNT(DISTINCT `phone`, `shop_code`) FROM customer WHERE phone is not null;
脚本成功执行,唯一索引成功添加。 -
mysql unique索引大小写不分问题
2019-03-20 10:54:21mysql unique索引大小写不分问题 -
MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别
2020-09-09 15:00:45本文给大家分享的是mysql索引中的KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别,即主键索引,唯一索引和普通索引的区别,希望大家能够喜欢 -
mysql – UNIQUE,UNIQUE KEY和CONSTRAINT’name’UNIQUE有什么区别?
2021-03-13 22:52:18我有一个基本的“用户”表,我想在MySQL中创建.我不希望在数据库中出现重复的电子邮件或重复的用户名.>创建餐桌时防止这种情况的最佳方法是什么?>以下是什么区别:1.UNIQUE(用户名),UNIQUE(电子邮件),2.UNIQUE... -
mysql中的unique
2021-04-20 10:28:38unique在MySQL中是完整性约束里的一种,如果某列的值需要是唯一的那么就添加UNIQUE约束。创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值... -
mysql 字段唯一 UNIQUE
2021-01-18 22:33:26一、创建表时:UNIQUE KEY的用途:主要是用来防止数据插入的时候重复的。1,创建表时CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City ... -
Mysql Unique 索引 与 NULL
2018-08-07 19:45:48只要索引中的 unique index allows duplicates if at least one of the columns is null. refer to unique index allows duplicates if at least one of the columns is null. -
MySQL如何使用UNIQUE来实现数据不重复插入的详细介绍
2021-02-10 09:00:45当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。SQL UNIQUE 约束UNIQUE 约束... -
mysql中unique key中在查询中的使用
2021-01-25 13:24:59PRIMARY KEY (`emp_no`),UNIQUE KEY `idxunique_first_name_gender` (`first_name`,`gender`),UNIQUE KEY `uniq_idx_firstname` (`first_name`,`gender`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 2、添加unique key:... -
mysql中关于Unique约束操作
2021-01-18 18:49:56为了防止数据表当中指定的列中会出现两个完全一样的值这种状况,我们可以使用UNIQUE来约束确保在非主键列中不输入重复的值。尽管UNIQUE约束与PRIMARYKEY约束都强制唯一性,但是如果想要强制一列或者是多列组合,不是... -
mysql唯一索引和unique
2021-01-19 16:44:23可以在声明表的时候就加入这样一个约束(下面是mysql的语法): create table Test ( id INT NOT NULL, name VARCHAR(30) unique, phoneNumber VARCHAR(20), password VARCHAR(32), primary key(id), unique key pn... -
mysql添加UNIQUE约束
2018-10-19 13:43:07创建表时添加 CREATE TABLE user ( Id_P int NOT NULL AUTO_INCREMENT, name varchar(255), UNIQUE (name) ) 表已经存在时: ALTER TABLE user ADD UNIQUE (name) -
Mysql的唯一性索引unique
2021-09-13 11:44:23唯一性索引unique影响: 唯一性索引表创建: 唯一性索引作用: unique与primary key的区别: 存在唯一键冲突时,避免策略: insert ignore: replace into: insert on duplicate key update: 死锁: ... -
MySQL唯一约束(UNIQUE KEY)
2021-02-04 02:17:45MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。在创建表时设置唯一约束在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法规则如下: ... -
我们如何从MySQL表中删除UNIQUE约束?
2021-03-15 12:56:35为了从MySQL表中删除UNIQUE约束,首先,我们必须检查由UNIQUE约束在表上创建的索引的名称。众所周知,SHOW INDEX语句用于此目的。SHOW INDEX语句的结果集中的“ key_name ”包含索引的名称。现在,借助DROP INDEX... -
Mysql的约束条件之unique(单列唯一和联合唯一)
2021-02-26 09:13:46Mysql的约束条件之unique 1.unique的单列唯一 unique 的建表方式有两种: # 第一种 create table department( id int, name char(10) unique ) # 第二种 create table department( id int, name char(10), ... -
【mysql】unique key index区别
2019-06-30 13:47:31mysql中的unique约束是通过索引实现的; key的含义是概念级别的,意味着唯一性,key的概念等价于unique; 所以说只要加了unique约束或者key,就会建立一个索引。 在mysql中,使用index或者unique(以及key)都会...