热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle主键约束自动建立索引问题-mysql教程

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

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

推荐阅读
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 数据仓库ETL开发过程中,如何有效进行测试是一个关键问题。由于数据仓库通常包含大量数据,并且出于安全考虑,开发库和测试库的数据与生产库不完全一致,这给测试带来了挑战。本文将探讨适用于ETL开发的测试方法,包括单元测试、集成测试以及具体测试技术。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • 在将Web服务器和MySQL服务器分离的情况下,是否需要在Web服务器上安装MySQL?如果安装了MySQL,如何解决PHP连接MySQL服务器时出现的连接失败问题? ... [详细]
  • SQL 连接详解与应用
    本文详细介绍了 SQL 连接的概念、分类及实际应用,包括内连接、外连接、自连接等,并提供了丰富的示例代码。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • BIEE中的最终用户界面被称为Presentation Layer(展现层)。展现层呈现的内容与用户在Web报表开发界面中看到的一致,使用业务语言进行描述,隐藏了技术细节,如星型模型。本文将详细介绍展现层的设计要点及其与业务模型层的关系。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • PHP 使用 Cookie 进行访问授权的方法
    本文介绍了如何使用 PHP 和 Cookie 实现访问授权,包括表单验证、数据库查询和会话管理等关键步骤。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
author-avatar
f永远喜爱捉迷藏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有