1. 程式人生 > 其它 >怎樣突破錶名30個字元的限制(r2筆記51天)

怎樣突破錶名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