网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.DBMS_REPAIR包修复损坏数据块.
.使用oralce Cursor.
.监控Oracle数据库的常用shell脚本.
.ORACLE常用傻瓜問題1000問(之四).
.使用Oracle9i JDeveloper构建应用.
.[oracle]使用Oracle10g jdbc 驱动.
.导出/导入与字符集之间问题的解决.
.Application Server主要特色.
.Linux的信号机制.
.Oracle SQL 内置函数的使用方法及.
.Oracle 10g 中管理物化视图变得更.
.Oracle数据分片技术.
.关于关系数据库主键的讨论.
.用sqlplus只输出数据到文本文件的.
.自己做张grub启动盘防防身.
.Oracle数据库管理脚本介绍.
.ORACLE中如何实现ASCII字符串和1.
.如何查找日期为某一天的文件.
.EXP、IMP 命令详解.
.如何在Oracle中用PL/SQL产生随机.

Oracle与MySQL删除字段时对索引和约束的处理

发表日期:2008-8-4


不知道有多少人清楚的知道,在Oracle中,如果一个复合索引,假定索引(a,b,c)三个字段,删除了(包括unused)其中一个字段,Oracle会怎么处理这个索引。同样,如果是约束,Oracle又怎么处理?


用Oracle为例子,我又拿mysql做了一个对比,看看mysql是怎么处理这个问题的。我这里不讨论谁好谁差,只是希望大家知道其中的差别与细节而已。


我们先看Oracle的例子,我们创建一个表,然后在上面创建一个约束,创建一个索引:


SQL10G>createtabletest(aint,bint,cint);

Tablecreated.

SQL10G>altertabletestaddconstraintpk_testprimarykey(a,b);

Tablealtered.

SQL10G>createindexind_testontest(b,c);

Indexcreated.


然后,我们检查刚才创建的约束与索引


  SQL10G>selectt.constraint_name,c.constraint_type,t.column_name,t.position,c.status,c.validated

2fromuser_cons_columnst,user_constraintsc

3wherec.constraint_name=t.constraint_name

4andc.constraint_type!='C'

5andt.table_name='TEST'

6orderbyconstraint_name,position;

CONSTRAINT_NAMECCOLUMN_NAMEPOSITIONSTATUSVALIDATED

------------------------------------------------------------

PK_TESTPA1ENABLEDVALIDATED

PK_TESTPB2ENABLEDVALIDATED

SQL10G>selectt.index_name,t.column_name,t.column_position,i.status

2fromuser_ind_columnst,user_indexesi

3wheret.index_name=i.index_name

4andt.table_name='TEST'

5*orderbyindex_name,column_position

INDEX_NAMECOLUMN_NAMECOLUMN_POSITIONSTATUS

-------------------------------------------------

IND_TESTB1VALID

IND_TESTC2VALID


现在,我们先删除索引上的字段,其实并没有物理删除,只是设置为unused:


SQL10G>ALTERTABLEtestSETUNUSED(c);

Tablealtered.

SQL10G>selectt.index_name,t.column_name,t.column_position,i.status

2fromuser_ind_columnst,user_indexesi

3wheret.index_name=i.index_name

4andt.table_name='TEST'

5orderbyindex_name,column_position;

norowsselected


发现了什么,索引也删除了。那我们再删除约束上的字段呢?


SQL10G>ALTERTABLEtestSETUNUSED(b);

ALTERTABLEtestSETUNUSED(b)

*

ERRORatline1:

ORA-12991:columnisreferencedinamulti-columnconstraint

SQL10G>ALTERTABLEtestSETUNUSED(b)CASCADECONSTRAINTS;

Tablealtered.

  SQL10G>selectt.constraint_name,c.constraint_type,t.column_name,t.position,c.status,c.validated

2fromuser_cons_columnst,user_constraintsc

3wherec.constraint_name=t.constraint_name

4andc.constraint_type!='C'

5andt.table_name='TEST'

6orderbyconstraint_name,position;

norowsselected


我们可以看到,正常的删除会报一个错误,如果我们指定了cascade,将会把对应的约束也删除。


我们看完了Oracle的处理过程,再看看mysql是这么处理删除索引上字段这个事情的


mysql>createtabletest(aint,bint,cint);

QueryOK,0rowsaffected(0.72sec)

mysql>altertabletestaddprimarykey(a,b);

QueryOK,0rowsaffected(0.27sec)

Records:0Duplicates:0Warnings:0

mysql>createindexind_testontest(b,c);

QueryOK,0rowsaffected(0.32sec)

Records:0Duplicates:0Warnings:0


我们执行同样的操作,先删除复合索引中的一个字段,然后删除约束中的一个字段。


mysql>altertabletestdropc;

QueryOK,0rowsaffected(0.58sec)

Records:0Duplicates:0Warnings:0

mysql>showindexfromtest;

+-------+------------+----------+-----------+

|Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|

+-------+------------+----------+-----------+

|test|0|PRIMARY|1|a|A|

|test|0|PRIMARY|2|b|A|

|test|1|ind_test|1|b|A|

+-------+------------+----------+-----------+

3rowsinset(0.06sec)

mysql>altertabletestdropb;

QueryOK,0rowsaffected(0.28sec)

Records:0Duplicates:0Warnings:0

mysql>showindexfromtest;

+-------+------------+----------+-----------+

|Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|

+-------+------------+----------+-----------+

|test|0|PRIMARY|1|a|A|

+-------+------------+----------+-----------+

1rowinset(0.03sec)


可以看到,mysql的处理方式是有差别的,mysql仅仅是把字段从索引中拿掉,而不是删除该索引。


本文的意思,就是想提醒大家,平常在做columns删除的时候,包括unused,一定要小心,是否有复合索引包含了该字段,否则,一不小心把索引删除了,可能将引发大的错误。

上一篇:Oracle数据库删除表中重复记录的常见方法 人气:820
下一篇:Oracle数据库定时Jobs作业的使用方法 人气:686
浏览全部Oracle的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐