怎样突破表名30个字符的限制(r2笔记51天)
根据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
- 将OpenOffice.org变成一个文档格式转换工具
- 客户端的web技术
- unwx:一个解压微信小程序的命令 、微信小程序是如何压缩的
- 我的第四款编辑器:微信公众号上使用 Markdown 来显示代码
- 将Quartz.NET集成到 Castle中
- listview滑动删除
- android电话拦截
- 多层分布式设计模式
- 我的职业是前端工程师【三】:学习前端只需要三个月【语言篇】
- 模式应用:自定义匹配
- 我的职业是前端工程师【五】: 前端工程师必会的六个调试技能
- WPF中ICommand接口 的一个设计问题
- 我的职业是前端工程师【四】:如何选择合适的前端框架,告别选择恐惧症
- 我的职业是前端工程师【七】:你真的懂前后端分离吗?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下Oracle设置定时任务备份数据库的教程
- centos8 使用yum 安装 rabbitmq的教程
- linux exa命令(比ls更好的展示文件体验)
- 浅谈linux kernel对于浮点运算的支持
- PyTorch版YOLOv4更新了,不仅适用于自定义数据集,还集成了注意力和MobileNet
- Apache shiro的简单介绍与使用教程(与spring整合使用)
- Linux中一种友好的find替代工具(fd命令)
- ubuntu下让python脚本可直接运行的实现方法
- 在linux (centos)上使用puppeteer实现网页截图功能
- centOS7.4 安装 mysql 5.7.26的教程详解
- linux最快的文本搜索神器ripgrep(grep的最好代替者)
- Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤
- 在centos7上搭建mysql主从服务器的方法(图文教程)
- Linux部署python爬虫脚本,并设置定时任务的方法
- centos6编译及安装ZLMediaKit解析