前言
项目最近验收,需要将数据库(Oracle11g)不合规范的表的字段进行类型修改,但是生产环境中是包含数据的,无法直接修改类型。并且某些字段还是主键,上面包含自增触发器,主键约束等。这里提供了两种方法,第一种不会影响该主键上的约束和触发器,但是略显繁琐。方法二步骤简单,但是会为该字段重新创建各种约束。
方法1:
#关闭各种触发器,约束
ALTER TRIGGER TIB_BILLING_DETAIL_TEMP Disable;
ALTER TABLE BILLING_DETAIL_TEMP DISABLE CONSTRAINT BILLING_DETAIL_TEMP_PK;
ALTER TABLE BILLING_DETAIL_TEMP DISABLE CONSTRAINT SYS_C0078432;
#增加临时字段
ALTER TABLE BILLING_DETAIL_TEMP ADD TEMP_COL varchar2(20);
UPDATE BILLING_DETAIL_TEMP SET TEMP_COl = trim(ID);
UPDATE BILLING_DETAIL_TEMP SET ID = NULL;
#修改原来字段类型
ALTER TABLE BILLING_DETAIL_TEMP MODIFY ID NUMBER(20,0);
UPDATE BILLING_DETAIL_TEMP SET ID = trim(TEMP_COL);
ALTER TABLE BILLING_DETAIL_TEMP DROP COLUMN TEMP_COL;
#开启触发器和主键约束
ALTER TRIGGER TIB_BILLING_DETAIL_TEMP ENABLE;
ALTER TABLE BILLING_DETAIL_TEMP ENABLE CONSTRAINT BILLING_DETAIL_TEMP_PK;
ALTER TABLE BILLING_DETAIL_TEMP ENABLE CONSTRAINT SYS_C0078432;
方法2:
新增一个列,这样原来列的约束也会被删掉,新增的列也需要重新创建约束,增加注释等。
ALTER TABLE BILLING_DETAIL RENAME COLUMN BILLING_ID to TEMP_COL;
ALTER TABLE BILLING_DETAIL ADD BILLING_ID NUMBER(22,0);
UPDATE BILLING_DETAIL SET BILLING_ID = trim(TEMP_COL);
COMMENT ON COLUMN BILLING_DETAIL.BILLING_ID is '订单id';
ALTER TABLE BILLING_DETAIL DROP COLUMN TEMP_COL;