怎樣突破錶名30個字元的限制
根據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
當然了,我不是想強行建立一個大於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 怎樣優雅的限制瞬時goruntine的個數Go
- jQuery限制“Text-Area”域中的字元的個數jQuery字元
- 兒童智慧手錶需要怎樣保障安全
- 樂視兒童手錶釋出 送給孩子的禮物智慧手錶怎樣?
- 怎樣檢視錶空間下的資料物件物件
- 建立一個日期 + 字元的使用者名稱字元
- Ticwatch 2智慧手錶美國眾籌 眾籌金額突破30萬美元
- 樂視Kido兒童手錶售罄!Kido智慧兒童手錶怎麼樣?
- 30:字元環字元
- EditText追加空格、限制字元等字元
- 蘋果簽名是怎樣給手機app簽名的呢?蘋果APP
- 怎樣用VC限制軟體的試用次數 (轉)
- Javascript 怎樣獲取副檔名?JavaScript
- 小米米兔兒童手錶怎麼樣 小米米兔兒童手錶評測
- yd電商行業怎樣才能突破私域增城行業
- Mssql Backup a Shell 突破特殊字元(轉)SQL字元
- 突破 DockerHub 限制,全映象加速服務Docker
- 突破限制,CSS font-variation 可變字型的魅力CSS
- 突破限制CSS font-variation可變字型的魅力CSS
- javascript限制textarea文字框輸入字元個數程式碼例項JavaScript字元
- 微信小程式如何突破模板訊息限制,獲取多個formId?微信小程式ORM
- ticwatch2智慧手錶怎麼樣 問問手錶抬手即問即答
- css如何設定字串中第一個字元的樣式CSS字串字元
- C++ 突破私有成員訪問限制C++
- 限制鍵盤輸入字元/位數字元
- 微軟出的手錶是這樣的!微軟
- 突破瀏覽器域名併發限制的解決方案瀏覽器
- 用Word突破網頁無法複製的限制(轉)網頁
- oracle對字元型別的列上線上重建index的限制!Oracle字元型別Index
- 華為榮耀智慧手錶怎麼樣?不在眼前而在於長遠
- 智慧手錶怎樣叫車?語音強過觸控操作
- 【實戰】基於OpenCV的水錶字元識別(OCR)OpenCV字元
- 360兒童手錶5s怎麼樣 360兒童手錶釋出會即將召開
- 突破常規限制執行asp木馬(轉)
- 3090顯示卡怎麼樣 3090顯示卡能玩什麼遊戲遊戲
- 1030顯示卡怎麼樣 1030顯示卡能玩什麼遊戲遊戲
- 3060顯示卡怎麼樣 3060顯示卡能玩所有遊戲嗎遊戲
- Android 突破 DEX 檔案的 64K 方法數限制Android