Oracle主键约束自动建立索引问题

约束用于确保数据库数据的完整性,在oracle数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中

约束用于确保数据库数据的完整性,在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

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1887200.html

(0)
上一篇 2025年2月22日 12:31:34
下一篇 2025年2月22日 12:31:51

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • navicat怎么导出数据

    当我们对mysql数据库进行了误操作,造成某个数据表中的部分数据丢失时,肯定就要利用备份的数据库,对丢失部分的数据进行导出、导入操作了。Navicat工具正好给我们提供了一个数据表的导入导出功能。 导出数据表 Navicat导出数据表的格式…

    2025年2月23日 数据库
    100
  • Excel数据如何批量导入navicat

    打开电脑上的Navicat,点击左上角的“连接”。 选择数据库类型。 填写相关的信息。 创建好之后就会显示存在的数据库名。 相关推荐:《Navicat for mysql使用图文教程》 选择指定的数据库名,右键单击,选择导入向导。 选择文件…

    2025年2月23日 数据库
    100
  • 不同备份策略不兼容引起的磁盘空间故障解决实例

    最近接收一个系统,上线运维一年余。交接时候,业务部门反映曾经出现磁盘空间占满故障。当时引起整个系统瘫痪,最后联系开发商介 应用系统生命周期是一个整体,除了最开始的需求调研、开发测试和上线,更长的时期是在运维方面。应用系统的价值体现也就是在运…

    数据库 2025年2月23日
    100
  • Oracle并行执行特性应用初探

    在历史数据转出测试过程中,通过不断的优化,包括SQL调整和数据库调整,从AWR中看到,基本上难以进行更多的性能提升,于是准备试 1. 序 在历史数据转出测试过程中,通过不断的优化,包括sql调整和数据库调整,从awr中看到,基本上难以进行更…

    数据库 2025年2月23日
    100
  • Oracle生产环境RMAN备份脚本

    题记:这里分享一下我们Oracle的备份脚本,这些脚本均在生产库运行,正确无误! 环境:SUSE Linux 10sp2 + Oracle 11gR1 说明:小 题记:这里分享一下我们oracle的备份脚本,这些脚本均在生产库运行,正确无误…

    数据库 2025年2月23日
    100
  • xtraBackup备份原理剖析

    xtrabackup作为innodb的hotbackup工具,由percona公司开发,因开源,热备份和物理备份而在mysql中部署广泛,详情的说明可见之前的 xtrabackup作为innodb的hotbackup工具,由percona公…

    数据库 2025年2月23日
    100
  • 再说MySQL中的 table_id

    最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因:由于table_list-gt;table_id为uint,而m_table 【背景】最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因…

    数据库 2025年2月23日
    100
  • 更改Oracle数据库连接端口

    Oracle数据库默认数据库监听与连接端口是1521, 但是有时候项目中需要更改默认端口,这样做很多时候客户要求,基于安全考虑. 以Ora oracle数据库默认数据库监听与连接端口是1521, 但是有时候项目中需要更改默认端口,,这样做很…

    数据库 2025年2月23日
    100
  • ORA-04030错误解决过程一例

    综合分析,报了04030的错误,而下面又分别报了27302及27301的错误。根据报错的意思,一方面,创建会话失败,另一方面,无法找到映 今天客户说从数据库后台发现报错,具体如下: Errors in file /Oracle/linuxi…

    数据库 2025年2月23日
    100
  • Linux中Mysql相关配置

    在Linux中安装好Mysql之后,要进行一些相关配置。根据需要修改 /etc/my.cnf,参考配置:[mysqld]# 设置默认为 INNODB 表,支持事务,支持行锁 在Linux中安装好Mysql之后,要进行一些相关配置。 根据需要…

    数据库 2025年2月23日
    100

发表回复

登录后才能评论