记录生产环境数据库问题
1.问题出现原因
在数据库中本地化城市字段原来是用char(1)类型来存放的城市对应的编码,但是当城市超过10之后,这里编码的大小从1会变成2,导致在数据库中插入时会有数据库异常的情况。
2.解决方法和出现的问题
-
这里最开始是准备通过把char(1)改完char(2)来解决,这样乍一看可解决,但是如果查询的是10以内的编码就会有问题,因为char类型是不可变长的,这里设置之后会给原来的1位的编码后面加上一个空格,所以在查询时会有问题
-
遇到这个问题后这里就想把这个改为varchar2(2)类型,因为varcahr2类型是可变长,可以解决这个问题,但是有存在新的问题,就是数据库中存在有数据,这里直接修改会出现
ORA-01439: column to be modified must be empty to change datatype
这个异常,这里是因为不可以修改有数据时的数据类型
解决方法:
这里可以通过先把原来的列重命名,然后把新增一条和原来名字相同的类,然后把数据复制到新增加的列,最后把原来的列删除
ALTER TABLE TSYS_DEPARTURE RENAME COLUMN LOCALIZED_CITY TO LOCALIZED_CITY_col;//重命名原来的列
ALTER TABLE TSYS_DEPARTURE ADD (LOCALIZED_CITY VARCHAR2(2));//新增和原来一样的列
update TSYS_DEPARTURE td1 set td1.LOCALIZED_CITY = (SELECT td2.LOCALIZED_CITY_col FROM TSYS_DEPARTURE td2 WHERE td1.URID=td2.URID); //复制数据
ALTER TABLE TSYS_DEPARTURE MODIFY (LOCALIZED_CITY VARCHAR2(2) NOT NULL);//这里是因为有数据时不能直接加非空的约束
COMMENT ON COLUMN TSYS_DEPARTURE.LOCALIZED_CITY IS '本地化城市';//加注释
ALTER TABLE TSYS_DEPARTURE DROP (LOCALIZED_CITY_col);//删除原来的列