关于primary key和unique index的奇怪问题 (58天)
今天一个dba交给我一个问题,让我帮忙查一下。说有个脚本运行的时候有错,让我看看是什么原因。
脚本的思路如下:
先drop PK,FK之类的constraint.
然后把表改个名
然后重新创建一个表
然后加上PK,FK和其他的constraint
根据报错,貌似是primary key创建失败导致的。
SQL> ALTER TABLE T1
2 ADD CONSTRAINT T1_PK
3 PRIMARY KEY (
BEN)
USING INDEX (CREATE UNIQUE INDEX T1_PK
ON T1(
BEN) PCTFREE 10
INITRANS 2
TABLESPACE POOL_IX
LOGGING
STORAGE( INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 400 PCTINCREASE 0 FREELISTS 1 ) ) 4 5 6 7 8 9 10 11 ;
ALTER TABLE T1
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
我查询了一下,index的情况
SQL> SELECT INDEX_NAME,index_type,TABLE_NAME FROM USER_INDEXES WHERE INDEX_NAME='T1_PK';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
T1_PK T_756_3
以上信息说明,index T1_PK还没有删除,表T_765_3是更名后的表。
由此可以推荐drop PK的时候没有成功。
貌似找到了问题的原因。
然后查看执行的记录。
发现
alter table xxx drop primary key的操作是执行成功的。
这样我就看不懂了。
都已经drop了怎么index还没删除,我把脚本copy到本地,找了个测试环境试了下,脚本还是没有问题。
drop primary key的时候 index会自动删除。
我想了又想,创建primary key的时候会自动创建unique index.我想万一index不是unique的,被其他人手工创建的,那样是不是就不会随着primary key自动删除了。
我查了下Index的情况,结果index还是unique的。
这种情况貌似有些解释不清了,到底使我们的脚本有问题还是本来环境就有问题。
我大胆的假设了一下,假设环境本来有问题。
那会不会是先创建unique index,然后再创建primary key.找了个测试环境。测试如下
CREATE UNIQUE INDEX T1_PK ON T1 (BEN);
ALTER TABLE T1
ADD CONSTRAINT T1_PK
PRIMARY KEY (
BEN);
然后尝试drop PK
ALTER TABLE T1 DROP PRIMARY KEY;
然后查询index,发现index没有删除。
所以可以基本推论,可能是以上的情况导致的。
然后得到一些信息,之前这些表有一些问题,是手工修复的。很可能是以上的步骤导致的。
我提供了修复的脚本,这个问题就基本告一段落了。但是我还有个疑问,有没有地方去查 primary key和unique index之间的关联,如果unique index创建在先,然后创建PK,有没有地方去标示这种情况,要不删除PK时时怎么自动删除unique index的?
- Line Counter - Writing a Visual Studio 2005 Add-In
- 百度地图之标注聚会
- How to Add an API to your Web Service
- 「微信小程序」剖析(四):原生的实时DOM转Virtual DOM
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- android上拉下拉加载更多数据
- 「微信小程序」剖析(二):框架原理 | 在桌面浏览器上运行的尝试
- Working with Windows Workflow Foundation in ASP.NET
- 微信小程序剖析【下】:运行机制
- android多屏幕分辨率适配
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
- 怎么解决web service circular reference 问题
- android使用LruCache对listview加载图片时候优化处理
- 如何创建一个兼容「微信小程序」的Web框架:WIN
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决thinkPHP 5 nginx 部署时,只跳转首页的问题
- Laravel 类和接口注入相关的代码
- laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
- laravel 如何实现引入自己的函数或类库
- PHP实现15位身份证号转18位的方法分析
- Yii框架的redis命令使用方法简单示例
- Laravel如何实现自动加载类
- 在Laravel中实现使用AJAX动态刷新部分页面
- laravel 自定义常量的两种方案
- Thinkphp页面跳转设置跳转等待时间的操作
- Laravel 创建可以传递参数 Console服务的例子
- laravel实现查询最后执行的一条sql语句的方法
- 解决laravel groupBy 对查询结果进行分组出现的问题
- laravel批量生成假数据的方法
- 对laravel in 查询的使用方法详解