WEB开发网
开发学院数据库Oracle Oracle与MySQL删除字段时对索引与约束的处理对照 阅读

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

 2008-06-05 12:43:06 来源:WEB开发网   
核心提示: 现在,我们先删除索引上的字段,Oracle与MySQL删除字段时对索引与约束的处理对照(2),其实并没有物理删除,只是设置为unused:SQL10G>ALTERTABLEtestSETUNUSED(c);Tablealtered.SQL10G>selectt.index_na

现在,我们先删除索引上的字段,其实并没有物理删除,只是设置为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

Tags:Oracle MySQL 删除

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接