精华内容
下载资源
问答
  • 但如果用户的索引字段中没有完全包含主键字段,InnoDB把剩下的主键字段加到索引末尾。  (二)例子  例子一: CREATE TABLE t (  a char(32) not null primary key,  b char(32) not null,  KEY ...
  • ORALCE 创建主键&...为什么oracle会自动创建索引呢?因为新增一条数据时,oracle先去数据库查询此条新增数据是否存在,如果不存在则插入成功,否则插入失败。试想下如oracle不自动创建索...

    ORALCE 创建主键&唯一约束同时也创建索引

    原理:

    主键和唯一约束都是限制表字段值不能重复,必须唯一的约束;

    当一个表中建有主键或唯一约束时,oracle会自动创建对应主键或唯一约束的索引,这索引是oracle自动创建的。为什么oracle会自动创建索引呢?

    因为新增一条数据时,oracle先去数据库查询此条新增数据是否存在,如果不存在则插入成功,否则插入失败。试想下如oracle不自动创建索引,查该新增数据是否存在于数据库就得整张表去扫描(千万级数据表全表扫描是不可想象的),数据量大时影响性能是肯定的。那么主键、唯一约束在新增数据时oracle都会先去数据库查询,用到查询就要用到索引提高性能,所以他就会默认创建索索引来提高检查数据是否存在来,从而提高查询效率。这就是oracle自动创建索引的初衷。

    展开全文
  • Oracle主键约束自动建立索引问题

    千次阅读 2014-10-14 15:00:26
     检验当为一个表建立主键索引时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录后,是否还能把把约束设为enable validate状态。    SQL> create ...

    约束用于确保数据库数据的完整性,在Oracle数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中,因为约束易于维护,并且具有最好的性能,所以实现数据完整性首选约束.
     
    一.约束分类
     
    1.Not null: 确保字段值不能为空。 
     
    2.Unique:  确保字段值唯一性,但不阻止多个空值的插入。 
     
    3.Primary key:最常用的约束(主键约束),主键约束的列值不仅不能重复,也不能为NULL,注意一张表最多只能有一个主键约束,当定义主键约束后oracle自动建立一个以主键为关键字段的索引。
     
    4.Foreign key:  定义了主从表之间的关系,foreign要定义在从表上,但主表必须具有主键约束或唯一约束,当定义froeign key后外部键列的数据必须在主表的主键列中存在,或者为NULL。 
     
    5.Check:  用于强制表行数据必须满足的条件,如工资表,工人工资必须在2000-5000之间。 
     
     二.约束状态
     
    enable validate:是默认,新旧数据同时满足约束规则
     
    enable novalidate:旧数据可以不满足,检新插入的数据要满足约束
     
    disable validate:不允许在表上执行任何DML操作,主要用在分区表,对于主键和唯一约事,会删除相应的唯一索引,但约束状态任可用
     
    disable novalidate数据可不满足约束规则,对于主键和唯一约事,会删除相应的唯一索引 
     
    三.建立主键约束产生索引
     检验当为一个表建立主键索引时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录后,是否还能把把约束设为enable validate状态。 
     
    SQL> create table t(i number constraint pk_i primary  key,v number);

    SQL> insert into t values(1,2);
     
    SQL> insert into t values(3,4);
     
    SQL> commit;
     
     
     
    SQL> select * from t;
     
            I          V
     ---------- ----------
              1          2
              3          4
      现在表中有两条记录,然后给它插主键为空或相同的值。 
     
     
    SQL> insert into t values('',10);
     
    ERROR at line 1:  ORA-01400: cannot insert NULL into ("Y"."T"."I") 
     
    SQL> insert into t values(1,10);
     insert into t values(1,10)
     *
     ERROR at line 1:
     ORA-00001: unique constraint (SYS.PK_I) violated
     
    可以看到全部报错,此时主键不能为空或重复


    四.修正约束数据
     
    当给一个表作主键约束时,因为已存数据不满足约束规则,会提示错误信息,些时必须对数据进行修正
     
    要修正数据先找出不满足约束的数据
     
    如下表,有不满足约束的数据
     
    SQL> select * from t;       
     
      I          V
     
    ---------- ------------------------         
     
     1          2         
     
    3          4         
     
    15        12         
     
    15        10
     
     
     
    如果一个表数据量多可通过如下方法查找
     
    SQL> alter table t drop constraint pk_i; 
     
    Table altered.
     
    SQL>conn y / 123
     
    SQL> @$Oracle_HOME/rdbms/admin/utlexcpt.sql
     
    Table created.
     
    SQL> alter table t add constraint pk_i primary key (i) exceptions into exceptions;
     
    SQL>select * from t where rowid in (select row_id from exceptions) ;
     
      I          V
     
     ---------- ------------------------         
     
    15        12         
     
    15        10
     
    找到了重复的记录
     
    修正
     
    SQL>update t set i=10 where v=12;
     
    SQL> select * from t;         
     
     I          V
     
    ---------- ----------         
     
     1          2         
     
     3          4         
     
     10        12         
     
    15        10
     
    再建主键约束
     
    SQL>alter table t add constraint pk_i primary key (i) ;
     
     Table altered.
     
    查看是否建立索引 
     
    SQL> select index_name from user_indexes; 
     
        INDEX_NAME
     
      ------------------------------
     
        PK_I 
     
    把约束关闭再次做同样的操用
     
    SQL> alter table t disable novalidate constraint pk_i;
     
    Table altered.
     
     SQL> insert into t values('',10);
     
    1 row created.
     
     SQL> insert into t values(1,10);
     
     1 row created.
     
     SQL> commit;
     
    Commit complete.
     
     SQL> select * from t; 
           
     
            I          V
     ---------- ----------
              1          2
              3          4
              1        10
     
                        10
     
     SQL>  select index_name from user_indexes;
     
    no rows selected
     
    可见当把约束关闭后就可以何意给表插数据了,而具索引也自动删除了。 
     
    现在激活约束
     
    SQL> alter table t enable validate constraint pk_i;
     
     alter table t enable validate constraint pk_i  ERROR at line 1:  ORA-02437: cannot validate (SYS.PK_I) - primary key violated
     
    因为表中主键有相同的值所以不能恢复到enable validate状态了
     
     
    再次测试回复到enable novalidate
     
    SQL> alter table t enable novalidate constraint pk_i;
     
    alter table t enable validate constraint pk_i  ERROR at line 1:  ORA-02437: cannot validate (SYS.PK_I) - primary key violated
     
    也失败了,enable novalidate不检查旧数据所以应该还能恢复到enable novalidate,但为什么不行呢?因为在执行命令时,会产生唯一性索引(对pk_i),但对表中pk_i列已经有了重复的值,无法建立唯一性索引。
     
     
    要想恢复到enable novalidate必须建立主键索引(关闭约束时自动删除的那个索引,非唯一)如下:
     
    SQL> create index pk_i on t(i);
     
     Index created.
     
    索引的默认类型是非唯一,非压缩,非反向键B*树索引。
     
     
    然后恢复到enable disvalidate,以后再插数据不能为空,主键也不能重复了.
     
    SQL> alter table t enable novalidate constraint pk_i;
     
    Table altered.
     
    SQL> insert into t values(1,14);
     
    insert into t values(1,14)  ERROR at line 1:  ORA-00001: unique constraint (SYS.PK_I) violated

    展开全文
  • 主键约束自动建立索引问题

    千次阅读 2013-06-17 16:32:49
    检验当为一个表建立主键索引时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录后,是否还能把把约束设为enable validate状态。   SQL> create table ...
             约束用于确保数据库数据的完整性,在oracle
    数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中,因为约束易于维护,并且具有最好的性能,所以实现数据完整性首选约束. 
    
     
     
    一.约束分类
    1.Not null: 确保字段值不能为空。
     
    2.Unique:  确保字段值唯一性,但不阻止多个空值的插入。
     
    3.Primary key: 最常用的约束(主键约束),主键约束的列值不仅不能重复,也不能为NULL,注意一张表最多只能有一个主键约束,当定义主键约束后oracle自动建立一个以主键为关键字段的索引。
     
    4.Foreign key:  定义了主从表之间的关系,foreign要定义在从表上,但主表必须具有主键约束或唯一约束,当定义froeign key后外部键列的数据必须在主表的主键列中存在,或者为NULL。
     
    5.Check:  用于强制表行数据必须满足的条件,如工资表,工人工资必须在2000-5000之间。
     
     
     二.约束状态
    enable validate:是默认,新旧数据同时满足约束规则
     
    enable novalidate:旧数据可以不满足,检新插入的数据要满足约束
     
    disable validate:不允许在表上执行任何DML操作,主要用在分区表,对于主键和唯一约事,会删除相应的唯一索引,但约束状态任可用
     
    disable novalidate数据可不满足约束规则,对于主键和唯一约事,会删除相应的唯一索引
     
     
    三.建立主键约束产生索引
    检验当为一个表建立主键索引时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录后,是否还能把把约束设为enable validate状态。

     

    SQL> create table t(i number constraint pk_i primary  key,v number);


    SQL> insert into t values(1,2); 

    SQL> insert into t values(3,4); 

    SQL> commit; 
     
    SQL> select * from t;
             I          V
    ---------- ----------
             1          2
             3          4
     现在表中有两条记录,然后给它插主键为空或相同的值。
     
    SQL> insert into t values('',10); 
    ERROR at line 1:  ORA-01400: cannot insert NULL into ("Y"."T"."I") 
     
    SQL> insert into t values(1,10);
    insert into t values(1,10)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SYS.PK_I) violated
     
    可以看到全部报错,此时主键不能为空或重复
    查看是否建立索引
     
    SQL> select index_name from user_indexes; 
     
        INDEX_NAME
      ------------------------------ 
        PK_I 
     
    把约束关闭再次做同样的操用
    SQL> alter table t disable novalidate constraint pk_i; 
    Table altered. 
     SQL> insert into t values('',10); 
    1 row created. 
     SQL> insert into t values(1,10); 
     1 row created. 
     SQL> commit; 
    Commit complete.
     SQL> select * from t; 
             
             I          V
    ---------- ----------
             1          2
             3          4
             1         10
                        10
     SQL>  select index_name from user_indexes; 
    no rows selected 
    可见当把约束关闭后就可以何意给表插数据了,而具索引也自动删除了。
     
    现在激活约束
    SQL> alter table t enable validate constraint pk_i; 
     alter table t enable validate constraint pk_i  ERROR at line 1:  ORA-02437: cannot validate (SYS.PK_I) - primary key violated 
    因为表中主键有相同的值所以不能恢复到enable validate状态了
     
    再次测试回复到enable novalidate
    SQL> alter table t enable novalidate constraint pk_i; 
    alter table t enable validate constraint pk_i  ERROR at line 1:  ORA-02437: cannot validate (SYS.PK_I) - primary key violated 
    也失败了, enable novalidate不检查旧数据所以应该还能恢复到enable novalidate,但为什么不行呢?因为在执行命令时,会产生唯一性索引(对pk_i),但对表中pk_i列已经有了重复的值,无法建立唯一性索引。
     
    要想恢复到enable novalidate必须建立主键索引(关闭约束时自动删除的那个索引,非唯一)如下:
    SQL> create index pk_i on t(i); 
     Index created. 
    索引的默认类型是非唯一,非压缩,非反向键B*树索引。
     
    然后恢复到enable disvalidate,以后再插数据不能为空,主键也不能重复了.
    SQL> alter table t enable novalidate constraint pk_i; 
    Table altered. 
    SQL> insert into t values(1,14); 
    insert into t values(1,14)  ERROR at line 1:  ORA-00001: unique constraint (SYS.PK_I) violated 
     
     
    四.修正约束数据
    当给一个表作主键约束时,因为已存数据不满足约束规则,会提示错误信息,些时必须对数据进行修正
    要修正数据先找出不满足约束的数据
    如下表,有不满足约束的数据
    SQL> select * from t;         
      I          V 
    ---------- ------------------------          
     1          2          
    3          4          
    15         12          
    15         10 
     
    如果一个表数据量多可通过如下方法查找
    SQL> alter table t drop constraint pk_i;   
    T able altered. 
    SQL>conn y / 123 
    SQL> @$ORACLE_HOME/rdbms/admin/utlexcpt.sql 
    Table created. 
    SQL> alter table t add constraint pk_i primary key (i) exceptions into exceptions; 
    SQL>select * from t where rowid in (select row_id from exceptions) ;
       I          V 
     ---------- ------------------------          
    15         12          
    15         10 
    找到了重复的记录
    修正
    SQL>update t set i=10 where v=12;
    SQL> select * from t;          
     I          V 
    ---------- ----------          
     1          2          
     3          4          
     10         12          
    15         10 
    再建主键约束
    SQL>alter table t add constraint pk_i primary key (i) ;
     Table altered. 
    展开全文
  • 主键=>unique+not null,所以也会自动索引 官网文档   14.4.3. Remove Indexes If you are loading a freshly created table, the fastest method is to create the table, bulk load the table's data ...

    官网文档 

    Since a DELETE of a row from the referenced table or an UPDATE of a referenced column will require a scan of the referencing table for rows matching the old value, it is often a good idea to index the referencing columns too. Because this is not always needed, and there are many choices available on how to index, declaration of a foreign key constraint does not automatically create an index on the referencing columns.

    官网文档说到   应该对外键建索引,但考虑到索引不是一定要的,而且类型有多种,所以不自动对外键建锁引,所以我们应该手动建

     

    Adding a unique constraint will automatically create a unique B-tree index on the column or group of columns listed in the constraint. A uniqueness restriction covering only some rows cannot be written as a unique constraint, but it is possible to enforce such a restriction by creating a unique partial index.

    unique约束会自动建索引

     

    A primary key constraint indicates that a column, or group of columns, can be used as a unique identifier for rows in the table. This requires that the values be both unique and not null. So, the following two table definitions accept the same data:

    主键=>unique+not null,所以也会自动建索引

    官网文档 

    14.4.3. Remove Indexes

    If you are loading a freshly created table, the fastest method is to create the table, bulk load the table's data using COPY, then create any indexes needed for the table. Creating an index on pre-existing data is quicker than updating it incrementally as each row is loaded.

    If you are adding large amounts of data to an existing table, it might be a win to drop the indexes, load the table, and then recreate the indexes. Of course, the database performance for other users might suffer during the time the indexes are missing. One should also think twice before dropping a unique index, since the error checking afforded by the unique constraint will be lost while the index is missing.

    14.4.4. Remove Foreign Key Constraints

    Just as with indexes, a foreign key constraint can be checked "in bulk" more efficiently than row-by-row. So it might be useful to drop foreign key constraints, load data, and re-create the constraints. Again, there is a trade-off between data load speed and loss of error checking while the constraint is missing.

    What's more, when you load data into a table with existing foreign key constraints, each new row requires an entry in the server's list of pending trigger events (since it is the firing of a trigger that checks the row's foreign key constraint). Loading many millions of rows can cause the trigger event queue to overflow available memory, leading to intolerable swapping or even outright failure of the command. Therefore it may benecessary, not just desirable, to drop and re-apply foreign keys when loading large amounts of data. If temporarily removing the constraint isn't acceptable, the only other recourse may be to split up the load operation into smaller transactions.‘

     

    这里还说到要定期对索引进行  删除,重建  因为索引维护久了之后效率会变得低下

     

     

    外键该不该使用索引?

     

     

    转载于:https://www.cnblogs.com/cdyboke/p/7089643.html

    展开全文
  • 创建索引主键

    千次阅读 2018-06-12 21:11:54
    一、 主建的创建与删除1. 创建表时同时创建主键(加primary key)Create Table Book( ID int identity(1,1) primary key, Name nvarchar... 用SQL语句单独创建主键1)创建主键同时会自动在该主键创建聚集索引语...
  • 但创建过程依然比较繁琐,需要手工定义子索引、主键,详见 PostgreSQL10:重量级新特性-支持分区,PostgreSQL 11 版本得到增强,在父创建索引主键、外键后,子上将自动创建,本文演示这三种场景。...
  • 一个最多只能创建一个主键,但可以创建多个唯一索引主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 主键和唯一索引的区别 二、区别 主键是一种约束,目的是对这个的某一列进行限制; ...
  • --前提代码: --创建数据库 create database UsersDBTest --sqlserver这一句话就可以... --创建表 create table UserInfo ( ID int identity(1,1) not null, Uname nvarchar(max) not null, Pwd n...
  • ①参照列没有索引的话,MySQL会自动创建索引,因为参照列含有主键,创建主键时MySQL默认创建所用; ②外键列的索引也是MySQL根据参照列自动创建的。 转载于:https://my...
  • 3、按照创建学生的步骤,依次将课程、成绩、教师表创建完毕; 1)成绩将“学号”和“课程号”设置为联合主键,“成绩”一列的类型设置为数字类型“int”; 2)课程将“课程号”设置为主键; 3)教师将...
  • 为什么要创建索引 mysql在默认的情况下,中的数据记录是没有顺序的,就是说,在数据检索的时候,符合条件的数据存在中的什么位置是不知道的,如果使用select 进行查询,数据库从第一条数据进行检索,找到第一...
  • 1,创建表时指定主键,如: create table tab1 ( id int, name varchar(255), primary key(id) ) in datadbs01; 2,使用alter语句修改结构的方式创建主键 create table tab1 ( id int, name varchar(255) ) ...
  • 自己的MySQL阅读笔记,持续更新,直到看书结束。数据库技术可以有效帮助一个组织或者企业科学、有效的管理数据,也是...SQL整理的目录今天有觉悟:专栏索引——个人的数据分析学习(持续更新)​zhuanlan.zhihu.co...
  • 否则的话,主键的生成策略一般选择自动生成(GenerationType.IDENTITY)或是序列生成(GenerationType.SEQUENCE)。往目标插入一条数据之间,JPA实现者从生成器选择一条关于目标主键记录,该记录保存目标...
  • 主键、聚集索引、非聚集索引区别

    千次阅读 2020-07-14 10:59:36
    下面是一个简单的比较 主键 聚集索引 用途 强制的实体完整性 ... 如果要创建的数据列中数据存在null,无法建立主键创建表时指定的 PRIMARY KEY 约束列隐式转换为 NOT NULL。 ...
  • 主键的要求,最关键的一点是:记录一旦插入到中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键造成一系列的影响。 选取主键的一个基本原则是:不使用任何业务相关的字...
  • 适合创建索引: 经常被查的字段,经常出现在where中的字段 分组的字段,在group by 中出现的的字段 存在依赖关系的子和父之间的联合查询,即主键或外键字段 设置唯一完整性约束的字段 desc table-name ; 查
  • 索引对数据库性能的影响?...一个只能有一个主键索引,但可以有多个唯一索引主键索引是唯一索引,但唯一索引不是主键索引主键可以和外键构成参照完整性约束,防止数据不一致。 mysql索引创建原则? ...
  • Does Postgres automatically put indexes on Foreign Keys and Primary Keys? Postgres会自动索引放在外键和主键上吗?
  • MySQL数据使用InnoDB作为存储引擎的时候,数据结构就是使用B+树,而的所有数据存储在主键索引上,也就是通常所说的聚簇索引,也就是每个都需要有个聚簇索引树,对于InnoDB,主键对应的索引就是聚簇索引的...
  • Oracle创建主键的三种方式

    千次阅读 2021-03-05 10:11:58
    Oracle中创建主键,可以有几种方式。第一种,在建表的时候同时指定主键,SQL> create table t_pk_01 (id number, constraint pk_id...
  • 微软推荐为每一个表建立一个聚集索引,但是由于sqlserver简单易用,而且很多人并不了解聚集索引,非聚集索引这些东西,所以如果sqlserver不在主键建立聚集索引的话,可能导致大部分的都是堆结构,而堆结构是...
  • MySQL8.0主键索引

    2020-10-12 11:50:17
    MySQL8.0主键(primary key)与索引 (index) 1. 主键索引的区别 (1)主键主要用来区分,故主键是唯一的,不能有多个主键。 (2)索引主要用来检索,为了快速查询,故可以有多个索引。...1、如果创建表users时,没
  • 数据库索引主键

    千次阅读 2016-06-20 09:16:46
     主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。  唯一性索引列允许空值,而主键列不允许为空值。  主键列在创建时,已经默认为空值 + 唯一索引了。  主键可以被其他引用为外键,而唯一...
  • 据我们所了解,sqlserver在添加主键的时候,会自动将我宝贵的聚集索引添加在我们的ID上,然后,有些时候,我们想添加在 常用的搜索的字段上,这个时候,如果主键已经创建了;我们可以使用下面的方法来进行更改: ...
  • <p>MySQL的二级索引(非聚集索引)存储的是主键的值,因此为进行二次查询,但是当没有指定主键的情况下是如何查询的呢?是直接定位到数据的行的物理位置吗?</p>
  • 索引是对数据库中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库中的特定信息。 索引的一个主要目的就是加快检索中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。 ...
  • Oracle建表、索引主键

    千次阅读 2017-05-04 21:11:31
    --主键 create table emp (id number constraint id_pr primary key ,name1 varchar(8)); create table emp9 (id number ,name1 varchar(8) ,constraint aba_pr primary key(id,name1)); --外键 create table ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,087
精华内容 45,234
关键字:

创建表的主键会自动创建索引