根据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