前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎样突破表名30个字符的限制(r2笔记51天)

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

作者头像
jeanron100
发布2018-03-14 16:02:33
2.1K0
发布2018-03-14 16:02:33
举报

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档