[20120301]删除主键与索引.txt

一些表建立的时候是通过建立主键来建立索引的,如果drop/disable主键对应的索引也会删除,如果做到drop/disable主键约束,而保留索引呢?看了以下手册,发现可以使用如下命令来保留索引:
ALTER TABLE table_name DROP PRIMARY KEY KEEP INDEX;
ALTER TABLE table_name DISABE PRIMARY KEY KEEP INDEX;

测试一下:

1.建立测试环境:

SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> CREATE TABLE t ( id NUMBER, name varchar2(10),CONSTRAINT pk_t PRIMARY KEY(id) );
Table created.
SQL> desc t
Name  Null?    Type
----- -------- ------------
ID    NOT NULL NUMBER
NAME           VARCHAR2(10)
--可以发现主键定义后ID不能为NULL。
SQL> SELECT constraint_name, constraint_type, index_name FROM user_constraints WHERE table_name = 'T';
CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
PK_T                           P PK_T
2.测试:
SQL> ALTER TABLE t disable PRIMARY KEY;
Table altered.
SQL> SELECT constraint_name, constraint_type, index_name FROM user_constraints WHERE table_name = 'T';
CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
PK_T                           P
SQL> SELECT * FROM user_indexes WHERE table_name = 'T';
no rows selected
--可以发现索引删除。
SQL> ALTER TABLE t enable PRIMARY KEY;
--如果执行ALTER TABLE t drop PRIMARY KEY;删除主键的同时也删除索引。这个测试忽略。
3.如果改用如下命令
SQL> ALTER TABLE t enable PRIMARY key ;
Table altered.
SQL> ALTER TABLE t DISABLE PRIMARY KEY KEEP INDEX;
Table altered.
SQL> SELECT constraint_name, constraint_type, index_name FROM user_constraints WHERE table_name = 'T';
CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
PK_T                           P
SQL> SELECT index_name,status FROM user_indexes WHERE table_name = 'T';
INDEX_NAME                     STATUS
------------------------------ --------
PK_T                           VALID
--可以发现索引依旧存在。
4.如果删除主键约束,执行如下:
SQL> ALTER TABLE t enable PRIMARY key ;
Table altered.
SQL> ALTER TABLE t DROP PRIMARY KEY KEEP INDEX;
Table altered.
SQL> SELECT constraint_name, constraint_type, index_name FROM user_constraints WHERE table_name = 'T';
no rows selected
SQL> SELECT index_name,status FROM user_indexes WHERE table_name = 'T';
INDEX_NAME                     STATUS
------------------------------ --------
PK_T                           VALID

--可以发现主键约束删除,但是索引依旧存在。

时间: 2024-09-29 14:30:28

[20120301]删除主键与索引.txt的相关文章

oracle删除主键查看主键约束及创建联合主键_oracle

1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 执行上面的SQL可以删除主键:如果不成功可以用 ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; --删除约束 ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; --设置被设置为主键的列为无效 DROP INDEX INDEX_NAME; --删除主键索引 2,查看主键约束 SELECT * FROM

MySQL 主键与索引的联系与区别分析_Mysql

关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.下面是主键和索引的一些区别与联系. 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键. 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除的

使用Kettle数据迁移添加主键和索引

Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,主要用于数据抽取.转换.装载.kettle兼容了市面上几十种数据库,故用kettle来做数据库的迁移视乎是个不错的选择. kettle的数据抽取主要在于抽取数据,而没有考虑数据库的函数.存储过程.视图.表结构以及索引.约束等等,而这些东西恰恰都是数据迁移需要考虑的事情.当然,如果在不考虑数据库中的函数.存储过程.视图的情况下,使用kettle进行数据的迁移还算是一个可行的方案. 这篇文章主要是讲述在使用kettle进行数据库的

MySQL添加删除主键的方法

  mysql添加删除主键操作是非常基本的操作,下面就将教您mysql添加删除主键的方法,如果您是刚刚接触mysql数据库的新人,不妨一看. 修改mysql的字符集: 在安装mysql5.0时可以设置好mysql的字符集,一般使用utf8的字符集 1.查看建立表"tablename"的sql语句 Show create table tablename;//查看建立表"tablename"的sql语句 | maos_mail_batch | CREATE TABLE

主键 索引 查询效率-主键和索引哪个查询效率更快??

问题描述 主键和索引哪个查询效率更快?? 1.有次面试被问到,主键和索引哪个查询更快?有没有哪个高手,能给详细解释下...在网上查了下,很多都只是给解释一统,簇聚索引和非簇聚索引,但没有特别明确给出答案.2.还有个问题是,如果在sql语句使用了函数,还能否给字段建立索引..求大侠赐教! 解决方案 1.1. 主键和索引都有很多种实现方式,对于同一种实现方式来说,速度是一样的1.2. 主键通常使用聚簇索引.可以认为聚簇索引是一种Hash索引,因此是比较快的2.用了函数能否建索引?当然是可以的.使用函

Oracle与Mysql主键、索引及分页的区别小结_oracle

区别: 1.主键,Oracle不可以实现自增,mysql可以实现自增. oracle新建序列,SEQ_USER_Id.nextval 2.索引: mysql索引从0开始,Oracle从1开始. 3.分页, mysql: select * from user order by desc limit n ,m. 表示,从第n条数据开始查找,一共查找m条数据. Oracle:select * from user select rownum a * from ((select * from user)a

获取DataList控件的主键和索引实用图解_实用技巧

"哈哈,看了这篇http://www.jb51.net/article/33388.htm,只有效果,但没有结果,我怎样获取选择行的相关记录?" Insus.NET首先多谢网友对上面那篇博文的关注.解决你的问题,可以尝试获取选择行的索引或是主键即可,能获取到主键,其它字段的值,也可以获取到了. 下图中,高亮选择区,即是针对问题解决而在原在代码添加的部分.一是在DataList控件添加一个DataKeyField,以便获取到它的主键值,另外还添加了两个铵钮及一个Label标答,用来显示选

oracle 数据按主键删除慢问题的解决方法_oracle

问题描述: 根据表主键id删除一条数据,在PL/SQL上执行commit后执行时间都大于5秒.!!! 问题分析: 需求是删除一个主表A,另有两个附表建有此表的主键ID的外键.删除A表的数据级联删除另两个表的关联数据.增删改查使用hibernate实现. 一开始一直以为是hibernate的内部处理上有关联操作导致的删除和更新数据缓慢.所以将原先使用hibernate的saveOrupdate方法,改查jdbc的 sql语句来处理update和delete数据操作.但是依然没效果!!! 怀疑数据库

oracle的主键约束添加删除

oracle的主键约束添加删除 1.创建表的同时创建主键约束一.无命名create table accounts (accounts_number number primary key,accounts_balance number);二.有命名 create table accounts (accounts_number number primary key,accounts_balance number,constraint yy primary key(accounts_number));