怎样突破表名30个字符的限制

简介: 根据oracle的规范,对象的长度最大为30位,也就是说,在平时的使用中如果碰到表名长度大于30位,首先oracle是不答应的,它会提示idnetifier too long的错误。
根据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              *
ERROR at line 1:
ORA-00903: invalid table name
表名不能以数字开头。来加一个前缀。
SQL> create table t_12389_ext_1000 as select*from cat where rownum 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



目录
相关文章
|
6月前
|
人工智能 搜索推荐 前端开发
OpenDeepSearch:搜索引擎革命!这个开源深度搜索工具让AI代理直接读懂网页,复杂问题一键拆解
OpenDeepSearch是基于开源推理模型的深度搜索工具,通过语义重排和多源整合优化检索效果,支持与AI代理无缝集成,提供快速和专业两种搜索模式。
441 10
OpenDeepSearch:搜索引擎革命!这个开源深度搜索工具让AI代理直接读懂网页,复杂问题一键拆解
|
消息中间件 Java Kafka
Kafka【环境搭建 01】kafka_2.12-2.6.0 单机版安装+参数配置及说明+添加到service服务+开机启动配置+验证+chkconfig配置说明(一篇入门kafka)
【2月更文挑战第19天】Kafka【环境搭建 01】kafka_2.12-2.6.0 单机版安装+参数配置及说明+添加到service服务+开机启动配置+验证+chkconfig配置说明(一篇入门kafka)
1076 1
|
SQL 关系型数据库 MySQL
MySQL中的12个SQL编写规范
SQL良好习惯提升查询清晰度、效率和安全性,包括使用EXPLAIN分析查询计划、DELETE/UPDATE时加LIMIT限制影响范围、为表和字段添加注释、关键字大写缩进、指定INSERT字段名、先测试后执行、表含主键及时间戳字段、Update/Delete需Where条件、用InnoDB引擎、避免SELECT *,选择UTF8字符集和规范索引命名。
MySQL中的12个SQL编写规范
|
Web App开发 编解码 移动开发
网页不安装插件如何播放RTSP/FLV视频
点量云流提出了一种基于后台拉流转码的方案,将RTSP/RTMP/FLV等协议的视频流转换为WebRTC格式,实现在现代浏览器中的无插件播放。此方案具有良好的兼容性,支持主流浏览器,无需担心兼容问题。它利用浏览器硬件解码能力,减少终端计算资源消耗,并且具备低延迟和高实时性的优点,延迟可控制在100ms以内,非常适合摄像头监控领域。此外,前端集成简单,仅需使用标准WebRTC接口即可接入,降低了复杂度。
510 9
|
数据挖掘 Python
如何将动态IP代理转换为静态IP代理的方法与步骤
如何将动态IP代理转换为静态IP代理的方法与步骤
654 6
|
存储 C语言 C++
C++遍历文件夹获取各文件名称并筛选指定格式类型的文件或具有特定名称的文件
C++遍历文件夹获取各文件名称并筛选指定格式类型的文件或具有特定名称的文件
269 1
|
SQL 存储 Java
Python-sqlparse解析SQL工具库一文详解(一)
Python-sqlparse解析SQL工具库一文详解(一)
4820 113
Python-sqlparse解析SQL工具库一文详解(一)
|
Java 关系型数据库 MySQL
|
关系型数据库 MySQL 容器
连接mysql报错Table ‘performance_schema.session_variables’
常规的方法是运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist解决的方法是:第一步:在管理员命令中输入: mysql_upgrade -u root -p --force 第二步:重新启动mysql的服务: n...
6703 0
|
Unix Linux 网络安全
林帆:Docker运行GUI软件的方法
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 继上周的“Kubernetes v1.0特性解析”分享之后,本周我们邀请到ThoughtWorks咨询师林帆为大家带来主题为“Docker运行GUI软件的方法”的分享。
3755 0