怎样突破表名30个字符的限制(r2笔记51天)

2018-03-14 16:02:33 浏览数 (1)

根据oracle的规范,对象的长度最大为30位,也就是说,在平时的使用中如果碰到表名长度大于30位,首先oracle是不答应的,它会提示idnetifier too long的错误。而30位的长度总是感觉受到限制,现在在做数据迁移的时候就碰到的类似的问题。 当然了,我不是想强行创建一个大于30位的表名,本来可读性就差些,办法总比困难多。想想别的招。 举个例子。 有一个表customer_details,表名长度是16位。 SQL> SELECT LENGTH('CUSTOMER_DETAILS') FROM DUAL; LENGTH('CUSTOMER_DETAILS') -------------------------- 16 如果表里的数据特别多,现在想把这个表分成1000个子表,子表的命名规则如下 CUSTOMER_DETAILS_EXT_1 .. CUSTOMER_DETAILS_EXT_1000 那样的话,子表的表名最大长度就是25位。 SQL> SELECT LENGTH('CUSTOMER_DETAILS_EXT_1000') FROM DUAL; LENGTH('CUSTOMER_DETAILS_EXT_1000') ----------------------------------- 25 在很多情况下,表名长度可能就达到了25位甚至更多,接近30位,那样的话再加后缀EXT_XXX表名就肯定不够了。 现在想能不能给表名做一个很好的映射,能够根据这个别名和真正的表明得到 重新命名后的表名。 换句话就是假设起的表的别名为TEST,能够根据TEST 和表名 CUSTOMER_DETAILS 得到子表名CUSTOMER_DETAILS_EXT_1000 考虑了一下几种情况,感觉都有些牵强,不够通用。 比如从表的末尾开始扣减字符,类似CUSTOMER_DETA_EXT_1000这样的形式。 但是如果表名很类似,只有最后一位不相同,那么这种命名规则就不适用了。 或者说从表名开始扣减字符,类似TOMER_DETAILS_EXT_1000这样的形式。 如果表名就前几位不同,那么这种命名规则也就不适用了。 如果根据加密算法,这样又有些小题大做了。而且对于加密的算法,自己也得花不少的功夫。 如果考虑把表名反转, 类似SLIATED_REMOTSUC_EXT_1000这样好像有点意思,但也是有点牵强。效果和去前几位后几位都是类似的。 最后想对于表的唯一性,又想通用,又想有可读性,最后采用object_id,让数据库生成的id来做为表的别名。 比如表CUSTOMER_DETAILS的Object_id为12389, 那么表名就是12389_EXT_1000,这样就能省下不少的空间做为子表的命名空间,如果要查找对应的父表,只需要根据objec_id即可。 在数据库中Object_id一般也不会超过10位,我想一个库里不会有10亿个Object吧。这样后面的子表命名就有了将近20位的空间。 来简单测试一下: CREATE TABLE 12389_EXT_1000 AS SELECT *from cat where rownum<2 * ERROR at line 1: ORA-00903: invalid table name 表名不能以数字开头。来加一个前缀。 SQL> create table t_12389_ext_1000 as select*from cat where rownum<2; Table created. 还有有的朋友可能会说,为什么不用data_object_id,那个代表最新的object_id。因为我们需要不变的id。 比如下面的场景中,data_object_id就可能和Object_Id不一致。 SQL> select object_id,data_object_id,object_name from dba_objects where owner='SYS' and object_name='T'; OBJECT_ID DATA_OBJECT_ID OBJECT_NAME ---------- -------------- ------------------------------ 18040 18040 T SQL> TRUNCATE TABLE T; Table truncated. SQL> select object_id,data_object_id,object_name from dba_objects where owner='SYS' and object_name='T'; OBJECT_ID DATA_OBJECT_ID OBJECT_NAME ---------- -------------- ------------------------------ 18040 18041 T

0 人点赞