精华内容
下载资源
问答
  • mysql 允许在唯一索引的字段中出现多个null值
    千次阅读
    2019-06-26 20:04:00

    线上问题:org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [update fl_table set id = ?, password = ?, email = ? where id = '3583954800']; Duplicate entry ' ' for key 'email'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ' ' for key 'email

    更新email字段为空时出现错误,查数据库发现表的email字段加了唯一索引,最多有一条为空或者其他值的数据

    解决办法:唯一索引可在索引列插入多次null

    email可以有多条email为null的记录,将冲突的字段设置为null,解决

     

    在sql server中,唯一索引字段不能出现多个null值

    在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。

    根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此。

     

    转载于:https://www.cnblogs.com/zhouj850/p/11093589.html

    更多相关内容
  • 不允许记录中出现重复索引值索引是:主索引和候选索引。主索引是指在指定的索引字段活表达式中不允许出现重复值索引。候选索引与主索引一样要求字段的唯一性,并决定了处理记录的顺序;在数据库自由表中,...

    不允许记录中出现重复索引值的索引是:主索引和候选索引。主索引是指在指定的索引字段活表达式中不允许出现重复值的索引。候选索引与主索引一样要求字段值的唯一性,并决定了处理记录的顺序;在数据库和自由表中,可以为每个表建立多个候选索引。

    4a5b7edc6b651ff0609f3767eafd0d81.png

    Visual FoxPro中的索引可以分为:普通索引、惟一索引、候选索引和主索引。不允许记录中出现重复索引值的索引是主索引和候选索引。

    主索引(Primary Index)

    主索引(Primary Index):(也叫主关键字)是指在指定的索引字段活表达式中不允许出现重复值的索引。

    主索引主要用于在永久性关系的父表或被引用表里建立参照完整性,它能确保输入字段值的唯一性,并且由该字段决定处理记录的顺序。一个数据库表只能有一个主索引

    如果在已经包含了重复数据字段中指定主索引,数据库将返回出错提示信息,如表中已经存在一个主索引,再建立索引只能用候选索引或者普通索引

    候选索引

    与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。在数据库和自由表中,可以为每个表建立多个候选索引。

    相关推荐:《mysql教程》

    展开全文
  • 哪些索引不允许记录中出现重复索引值的发布时间:2020-09-04 14:49:32来源:亿速云...不允许记录中出现重复索引值索引是:主索引和候选索引。主索引是指在指定的索引字段活表达式中不允许出现重复值索引。候选...

    哪些索引是不允许记录中出现重复索引值的

    发布时间:2020-09-04 14:49:32

    来源:亿速云

    阅读:98

    作者:小新

    这篇文章主要介绍了哪些索引是不允许记录中出现重复索引值的,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。不允许记录中出现重复索引值的索引是:主索引和候选索引。主索引是指在指定的索引字段活表达式中不允许出现重复值的索引。候选索引与主索引一样要求字段值的唯一性,并决定了处理记录的顺序;在数据库和自由表中,可以为每个表建立多个候选索引。

    Visual FoxPro中的索引可以分为:普通索引、惟一索引、候选索引和主索引。不允许记录中出现重复索引值的索引是主索引和候选索引。

    主索引(Primary Index)

    主索引(Primary Index):(也叫主关键字)是指在指定的索引字段活表达式中不允许出现重复值的索引。

    主索引主要用于在永久性关系的父表或被引用表里建立参照完整性,它能确保输入字段值的唯一性,并且由该字段决定处理记录的顺序。一个数据库表只能有一个主索引

    如果在已经包含了重复数据字段中指定主索引,数据库将返回出错提示信息,如表中已经存在一个主索引,再建立索引只能用候选索引或者普通索引

    候选索引

    与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。在数据库和自由表中,可以为每个表建立多个候选索引。

    感谢你能够认真阅读完这篇文章,希望小编分享哪些索引是不允许记录中出现重复索引值的内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!

    展开全文
  • mysql允许在相同列上创建多个索引,无论是有意还是无意,mysql需要单独维护重复索引,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能。  重复索引是指的在相同的列上按照相同的顺序创建的相同...
  • 据库默认值都有null,此时创建唯一索引时要注意了,此时数据库会把空作为多个重复值
  • oracle null值和索引

    千次阅读 2018-09-05 11:03:50
    NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种,通常称为...正是基于这样一个特性,对于NULL值列上的B树索引导致了is null/is not null不索引的情形,下面描述了NULL值索引以及索...

    NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的。由于NULL存在着无数的可能,因此NULL值也不等于NULL值,所以与NULL值相关的操作同样都为NULL值。正是基于这样一个特性,对于NULL值列上的B树索引导致了is null/is not null不走索引的情形,下面描述了NULL值与索引以及索引NULL列上的执行计划,如何使得NULL值走索引的情形。注:本文仅仅讨论的是B树索引上的NULL值,位图索引不在此范围之内。


    一、null值与索引
    SQL> create table test(id number(2),name varchar2(10),age number(2));
    SQL> create unique index test_id_ind on test(id);

    //id上存在唯一索引,但由于null值不等于null值,因此能成功插入
    SQL> insert into test(id,name,age) values(null,'test1',10);
    SQL> insert into test(id,name,age) values(null,'test2',10);
    SQL> commit;

    //在test表上创建唯一复合索引,基于id,name列
    SQL> create unique index test_id_name_ind on test(id,name);

    //基于多列的复合索引,不全为null的重复行则不能被插入
    SQL> insert into test(id,name,age) values(null,'test1',20);
    insert into test(id,name,age) values(null,'test1',20)
    *
    第 1 行出现错误:
    ORA-00001: 违反唯一约束条件 (SCOTT.TEST_ID_NAME_IND)

    //(null,null)不等同于(null,null),所以的两次null能够被插入。
    SQL> insert into test(id,name,age) values(null,null,20);
    SQL> insert into test(id,name,age) values(null,null,20);

    SQL> commit;

    SQL> select * from test;
            ID NAME              AGE
    ---------- ---------- ----------
               test1              10
               test2              10
                                  20
                                  20

    SQL> exec dbms_stats.gather_table_stats('scott','test',cascade=>true);

    //注意:虽然我们建表时使用了"test"小写表名,但因为表名以大写存储,所以此时应该使用"TEST"
    SQL> select index_name,index_type,num_rows,status,distinct_keys from user_indexes where table_name='TEST';

    INDEX_NAME         INDEX_TYPE    NUM_ROWS   STATUS   DISTINCT_KEYS
    ------------------ ------------  ---------- -------- -------------
    TEST_ID_IND        NORMAL        0         VALID                0
    TEST_ID_NAME_IND   NORMAL        2         VALID                2


    二、null值与执行计划
    SQL> set autotrace traceonly;

    由于null值是不被存储,所以当使用id is null作为谓词时,走了全表扫描
    SQL> select * from test where id is null;
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     3 |    21 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| TEST |     3 |    21 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------

    尽管当前表上id列上的所有值都为null,但不排除后续记录插入的id不为null的列。所以当使用id is not null作为谓词时,此时执行计划中走了索引全扫描。
    SQL> select * from test where id is not null;
    ------------------------------------------------------------
    | Id  | Operation                   | Name        | Rows  |
    ------------------------------------------------------------
    |   0 | SELECT STATEMENT            |             |     1 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST        |     1 |
    |*  2 |   INDEX FULL SCAN           | TEST_ID_IND |     1 |
    ------------------------------------------------------------

    对于复合唯一索引的情形,当使用单列且非前导列谓词时,使用is null与 is not null等同于单列唯一索引的情形。name is null走全表扫描而name is not null走索引。
    SQL> select * from test where name is null;
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |     7 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| TEST |     1 |     7 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------

    SQL> select * from test where name is not null;
    ------------------------------------------------------------------------
    | Id  | Operation                   | Name             | Rows  | Bytes |
    ------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                  |     2 |    14 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST             |     2 |    14 |
    |*  2 |   INDEX FULL SCAN           | TEST_ID_NAME_IND |     1 |       |
    ------------------------------------------------------------------------

    //下面看看两个列都作为谓词的情形

    尽管两个谓词列上都存在索引,一个为单列唯一索引,一个为复合唯一索引。Oracle 选择了复合索引test_id_name_ind。
    SQL> select * from test where id is null and name is not null;
    ----------------------------------------------------------------
    | Id  | Operation                   | Name             | Rows  |
    ----------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                  |     2 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST             |     2 |
    |*  2 |   INDEX RANGE SCAN          | TEST_ID_NAME_IND |     1 |
    ----------------------------------------------------------------

    谓词的顺序与复合索引定义的顺序一样,第一个谓词为id is not null,而第二个谓词为name is null。此时Oracle 选择了单列唯一索引test_id_ind。
    SQL> select * from test where id is not null and name is null;
    -------------------------------------------------------------------
    | Id  | Operation                   | Name        | Rows  | Bytes |
    -------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |             |     1 |     7 |
    |*  1 |  TABLE ACCESS BY INDEX ROWID| TEST        |     1 |     7 |
    |*  2 |   INDEX FULL SCAN           | TEST_ID_IND |     1 |       |
    -------------------------------------------------------------------


    三、is null走索引
    SQL> set autot off;

    SQL> delete from test where name is null;

    SQL> select * from test;
            ID NAME              AGE
    ---------- ---------- ----------
               test1              10
               test2              10

    SQL> update test set id=1 where name='test1';
    SQL> update test set id=2 where name='test2';
    SQL> commit;

    SQL> alter table test modify id not null;

    SQL> set autot trace exp;
    SQL> select * from test where id is null;
    ----------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)|
    ----------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     1 |     7 |     0   (0)|
    |*  1 |  FILTER            |      |       |       |            |
    |   2 |   TABLE ACCESS FULL| TEST |     3 |    21 |     3   (0)|
    ----------------------------------------------------------------

    //组合索引中,第一个字段没有出现在where语句中,此时走INDEX SKIP SCAN
    SQL> select * from test where name is null;
    ----------------------------------------------------------------
    | Id  | Operation                   | Name             | Rows  |
    ----------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                  |     1 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST             |     1 |
    |*  2 |   INDEX SKIP SCAN           | TEST_ID_NAME_IND |     1 |
    ----------------------------------------------------------------

    SQL> insert into test(id,name,age) values(3,null,30);
    SQL> commit;

    SQL> exec dbms_stats.gather_table_stats('scott','TEST',cascade=>true);

    SQL> select index_name,index_type,num_rows,status,distinct_keys from user_indexes where table_name='TEST';
    INDEX_NAME         INDEX_TYPE   NUM_ROWS    STATUS   DISTINCT_KEYS
    ------------------ ----------- ------------ -------- -------------
    TEST_ID_IND        NORMAL       3          VALID               3
    TEST_ID_NAME_IND   NORMAL       3          VALID               3


    四、通过基于函数的索引来使得is null使用索引
    SQL> create table test2(id number(2),name varchar2(10));

    //用nvl函数来创建函数索引,即当obj_id为null值时,存储-1
    SQL> create index test2_fn_ind on test2(nvl(id,-1));

    SQL> select count(*) from test2 where nvl(id,-1)=-1;
    ---------------------------------------------------------
    | Id  | Operation         | Name        | Rows  | Bytes |
    ---------------------------------------------------------
    |   0 | SELECT STATEMENT  |             |     1 |    13 |
    |   1 |  SORT AGGREGATE   |             |     1 |    13 |
    |*  2 |   INDEX RANGE SCAN| TEST_FN_IND |     1 |    13 |
    ---------------------------------------------------------

    五、使用伪列创建基于函数的索引来使得is null使用索引
    //通过添加一个值为-1(可取任意值)的伪列来创建索引
    SQL> create index test2_new_id_ind on test2(id,-1);
    SQL> select count(*) from test2 where id is null;
    -------------------------------------------------------------
    | Id  | Operation         | Name            | Rows  | Bytes |
    -------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                 |     1 |    13 |
    |   1 |  SORT AGGREGATE   |                 |     1 |    13 |
    |*  2 |   INDEX RANGE SCAN| TEST_NEW_ID_IND |     1 |    13 |
    -------------------------------------------------------------


    四、总结

    无论是单列唯一索引或复合唯一索引,对于可以为null的列或复合null值,Oracle不会为其存储索引值。故在基于单列创建B树唯一索引或多列创建B树复合唯一索引的情形下,
    当列上允许为null值时:
        where子句使用了基于is null的情形,其执行计划走全表扫描。
        where子句使用了基于is not null的情形,其执行计划走索引扫描。

    当列上不允许为null值时,存在非null约束:
        where子句使用了基于is null的情行,其执行计划走索引扫描。
        where子句使用了基于is not null的情形,其执行计划走索引扫描。

    Null与索引使用时的建议:
    1、对于用于连接或经常被谓词使用到的列应尽可能避免NULL值属性,因为它容易导致索引失效。
    2、为需要使用NULL值的列添加缺省值(alter table tb modify(col default 'Y'))。
    3、如果NULL值不可避免也不能使用缺省值,应考虑为该常用列使用nvl函数创建索引,或使用伪列来创建索引以提高查询性能。
    4、对于复合索引应保证索引中至少有一列不为NULL值,还是因为全部列为NULL时不被索引存储,以保证使用is null是可以使用索引。
    5、对于复合索引应保证索引列应使用数据类型长度最小的列来添加not null约束应节省磁盘空间。

    展开全文
  • mysql使用唯一索引避免插入重复数据

    千次阅读 2021-02-07 16:19:55
    使用MySQL 索引防止一个表中的一列或者多列产生重复值一:介绍MYSQL唯一索引如果要强烈使一列或多列具有唯一性,通常使用PRIMARY KEY约束。 但是,每个表只能有一个主键。 因此,如果使多个列或多个组合列具有唯一性...
  • NULL 索引(一)

    万次阅读 2012-04-08 13:22:16
    NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种,通常称为...正是基于这样一个特性,对于NULL值列上的B树索引导致了is null/is not null不索引的情形,下面描述了NULL值索引以及索
  • 为什么能写入重复数据呢?在存在唯一索引前提下。请高手帮忙解惑,谢谢唯一索引:UNIQUEKEY`uwu`(`UserId`,`WeixinOpenid`,`UnionID`),1:表结构信息如下:CREATETABLE`t_weixin`(`WeixinId`bigint(20)NOTNULLAUTO_...
  • What you're looking for is indeed part of the ANSI standards SQL:92, SQL:1999 and SQL:2003, ie a UNIQUE constraint must disallow duplicate non-NULL values but accept multiple NULL values. In the ...
  • MySQL索引失效的几种情况汇总

    千次阅读 2021-01-18 20:19:54
    索引不存储null值更准确的说,单列索引不存储null值,复合索引不存储全为null索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只能全表扫描。为什么索引列不能存...
  • 其中表phone字段允许null,默认为null。 操作: 使用sql执行脚本执行添加索引sql。执行时报错。提示有创建唯一约束字段存在重复值。 排查问题: SELECT COUNT(DISTINCT `phone`, `shop_code`) from customer; 1
  • NULL 索引

    千次阅读 2013-08-31 19:46:00
    NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种,通常称为UNKNOWN或空值,即是未知...NULL存在着无数的可能,因此NULL值等于NULL值,所以与NULL值相关的操作同样都为NULL值。正是基
  • 一文搞懂MySQL索引所有知识点(建议收藏)

    万次阅读 多人点赞 2020-10-24 12:19:05
    普通索引 MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。 唯一索引 索引列中的必须是唯一的,但是允许为空值。 全文索引 只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。...
  • MySql索引

    千次阅读 2021-01-18 21:12:40
    索引简介索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列的集合与相应的指向表中数据的指针组成清单。索引的作用相当于书的目录,可以根据目录中的页码快速定位到所需的内容。索引是一种使记录有序...
  • 索引(四)使用MySQL唯一索引避免重复

    千次阅读 2019-08-02 13:49:33
    摘要:这篇文章中,我们会一起聊下如何使用MySQL 索引防止一个表中的一列或者多列产生重复值 一:介绍MYSQL唯一索引 如果要强烈使一列或多列具有唯一性,通常使用PRIMARY KEY约束。 但是,每个表只能有一个主键。 因此...
  • 别踩坑!使用MySQL唯一索引请注意

    万次阅读 多人点赞 2019-01-28 21:33:14
    背景 在程序设计中了,我们往往需要...但是我们能确保同时有两个人使用同一个手机号注册到我们的系统中,因此这里就需要在更深的层次去确保手机号的唯一性了。不同存储方案,解决方式一样,这里以MySQL为例,我...
  • 谈谈唯一约束唯一索引

    千次阅读 2021-01-27 20:54:06
    约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性一致性。索引 数据库中用的最频繁的操作是数据查询,索引...主键约束不同,唯一约束允许NULL,只...
  • MySQL高性能索引创建策略

    千次阅读 2021-12-26 19:10:17
    虽然索引是个好东西,在学习如何更好的使用索引之前先要了解一下使用它的代价,它在空间时间上都会拖后腿。 空间上的代价 这个是显而易见的,每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个...
  • Mysql索引:图文并茂,深入探究索引的原理使用

    万次阅读 多人点赞 2020-11-25 16:43:44
    关于Mysql索引的走心总结,建议收藏,反复阅读。
  • 往mysql的表中批量插入数据,要求是:如果没有重复的记录就是正常插入数据,如果有重复的那就把这条表中原有记录的某个字段,加上需要插入数据的对应字段; 我这里判断数据充重不重复是根据记录中orderAccount...
  • 数据库表的主键、唯一约束和索引

    千次阅读 2021-11-23 17:31:46
    1、MySQL 的 主键。...(2)主键必须唯一标识表中的每一行,且能为 NULL,即同一个表中可能存在两行数据有相同的主键值。 2、MySQL 的 唯一约束。  MySQL唯一约束(Unique Key)是指所有记录中字
  • 2. 知识剖析MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。创建索引时,你需要确保该索引是应用在SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该...
  • 说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引值和包含这个的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某...
  • (六)6-4Mysql数据修改和索引

    千次阅读 2021-01-19 01:48:46
    mysql修改、删除数据记录用update修改记录UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]update用于对满足where条件的行进行修改,通过set之心column的新例如update student set age...
  • 1.堆组织表(HOT)和索引组织表(IOT)有什么区别? myisam使用的堆组织表(Heap Organize Table, HOT),没有聚集索引的概念,使用B-tree索引的存储格式,显示都是随机顺序。 innodb表是索引组织表(Index Organized Table,...
  • 唯一约束唯一索引区别

    千次阅读 2017-09-21 21:02:55
    3) 主键列上没有任何两行具有相同(即重复值),不允许空(NULL).4) 主健可作外健,唯一索引不可; 2.唯一性约束(UNIQUE) 1) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问...
  • MySQL中重复索引和重复外键清理

    千次阅读 2015-10-27 17:36:20
    MySQL允许在相同列上创建重复索引,但这样做对数据库却是有害而无利的,需要定期检查此类重复索引以改善数据库性能。可减少磁盘空间占用、减少磁盘IO、减少优化器优化查询时需要比较的索引个数、减少数据库维护...
  • 我坚信我的想法是正确的,在网上查了些网页,有说可以有多个NULL,有多只能有一个NULL值,我只有自己实验看看,分别在mssql2003mssql2005上试验,竟然都只允许有一个NULL,插入第二个NULL时就报错。 唯一索引真.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,818
精华内容 60,727
关键字:

不允许出现重复值和null值的索引