Oracle与MySQL删除字段时对索引和约束的处理
作者:Alice 发布时间:2008-12-26 16:41:00
不知道有多少人清楚的知道,在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,一定要小心,是否有复合索引包含了该字段,否则,一不小心把索引删除了,可能将引发大的错误。
猜你喜欢
- 认知心理学家Donald A. Norman将人类的行动分解成七个阶段:1. 确定目标2. 确定意图3. 明确行动内容4. 执行5. 感知外
- 删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL 代码如下:ALTER PROCEDURE [dbo].[proc_tb
- 最近因工作需要,要在静态页面上实现分页,想了下,决定用AJAX来实现,所以就捣鼓了下面这么个东西,截图如下:更多关于分页的文章演示地址:ht
- 代码如下:<% '=================================================
- 本文介绍了一种将英文字符首个字母串转换为大写的asp代码,当然这个功能可能英文网站比较有用。转换大写功能英文介绍:Code Title: P
- 本文重在实践和测试,如果你还不了解Data URI,推荐先阅读秦歌的Data URI 和 MHTML。旺旺点灯(JS)实践经过:因为要对SR
- 永远不要相信用户输入的内容具有适当的大小或者包含适当的字符。在使用其做出决策之前应该始终对用户输入进行验证。最佳的选择是创建一个
- 在国外一博客看到的技巧,终于解决IE的这个老大难问题。我在IE的setAttribute bug也提到其解决方法,一是innerHTML,一
- 无聊,写了一个图片后加载的东东,感谢asfman帮忙<!DOCTYPE html PUBLIC "-//W3C//DTD X
- 对大家推荐很好使用的MySql节点系统,像让大家对MySql节点系统有所了解,然后对MySql节点系统全面讲解介绍,希望对大家有用在向大家详
- 如何在ASP.NET中使用ADO.NET连接数据库?以连接Access数据库为例,步骤如下:一、我们来用有源ODBC DSN的方法和无源OL
- 目前代码应该没什么bug了,兼容IE6.0 & FF 1.5, 通过xHTML 的Transitional验证和 CSS 验证。为了
- 最近将Jesse James Garrett的《用户体验的要素》一书读了两遍,做一些简要的摘录并添加一些个人注释。当然,一本好书绝对不是简单
- Conditional-CSS允许你针对单一浏览器或浏览器组写出有逻辑条件的可维护的特定的CSS声明。使CSS针对特定的浏览器。简化你对CS
- 目前,很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELE
- 分页浏览功能是常见的Web应用功能,对于MySQL数据库来说可以很轻松的使用limit语句实现分页,而对于SQL Server数据库来说,常
- MySQL Order By keyword是用来给记录中的数据进行分类的。MySQL Order By Keyword根据关键词分类ORD
- Photoshop Express,也就是传说中的web版photoshop,来了。和想象中的web photoshop相比,这个Photo
- 一.windows系统的解决方法1.首先以系统管理员身份登陆系统。2.停止MySQL的服务。3.进入命令窗口,然后进入MySQL的安装目录,
- [Q]怎么样查询特殊字符,如通配符%与_ [Q]如何插入单引号到数据库表中 [Q]怎样设置事务一致性 [Q]怎么样利用光标更新数据 [Q]怎