怎樣突破錶名30個字元的限制

dbhelper發表於2014-11-26
根據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



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章