> 데이터 베이스 > MySQL 튜토리얼 > 通过在线重定义来增加大表列默认值

通过在线重定义来增加大表列默认值

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-06-07 16:47:30
원래의
1142명이 탐색했습니다.

其中提到11G之前,可以通过在线重定义表的方式,来进行列的增加(且有默认值)。

之前的文章讨论过11G中关于大表增加列的新特性  ,

其中提到11G之前,可以通过在线重定义表的方式,来进行列的增加(且有默认值)。

在线重定义权限需求:

grant create any table to 用户;
grant alter any table to 用户;
grant drop any table to 用户;
grant lock any table to 用户;
grant select any table to 用户;
grant create any trigger to 用户;
grant create any index to 用户;

1.SQL获取原始表的DDL

可通过如下设置,,将storage 子句去除,也可以不去执行

begin
    Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
                                    'SQLTERMINATOR',
                                    True);
  Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
                                    'STORAGE',
                                    False);
end;

获取原始表的DDL语句(这里例子为T)

set pagesize 5000
set long 50000
Select Dbms_Metadata.Get_Ddl(Object_Type => 'TABLE', Name => 'T')  from dual
union all
select Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'CONSTRAINT',Base_Object_Name => 'T')  from dual
union all
select Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX',Base_Object_Name => 'T')  from dual
union all
select Dbms_Metadata.Get_Dependent_Ddl('OBJECT_GRANT', 'T', 'SCOTT')  from dual;

2.将获取的语句中的 表名T,替换为T2,之后建立。
 
3.给t2表 增加字段(带有默认值)

alter table t2 add MrDai varchar2(10) default 'MrDai';

4.检查一下能否T表能否进行重定义,如果执行成功,则表示可以,否则将会报错显示为什么不可以

exec Dbms_Redefinition.Can_Redef_Table(USER, 'T');

5.开始重定义

注意:如原始表有未提交的事物,该过程会一直在等待,等待事件为enq: TX - row lock contention

exec  dbms_redefinition.start_redef_table(uname => USER,orig_table => 'T',int_table => 'T2',options_flag => DBMS_REDEFINITION.cons_use_pk);

6.完成重定义

exec dbms_redefinition.finish_redef_table(uname=>USER,orig_table=>'T',int_table=>'T2');

查看重定义以后的t

SQL> desc t;
 Name        Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER          VARCHAR2(30)
 OBJECT_NAME        VARCHAR2(128)
 SUBOBJECT_NAME         VARCHAR2(30)
 OBJECT_ID      NOT NULL NUMBER
 .
 .
 .
 MRDAI          VARCHAR2(10)

已经添加列完成。

 

 

linux

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿