怎樣突破錶名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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微信公眾號怎樣突破群發次數限制?
- 使用 Proxy 突破網管的限制
- 建立一個日期 + 字元的使用者名稱字元
- EditText追加空格、限制字元等字元
- 檢視錶名和表的行數
- 【實戰】基於OpenCV的水錶字元識別(OCR)OpenCV字元
- 蘋果簽名是怎樣給手機app簽名的呢?蘋果APP
- Javascript 怎樣獲取副檔名?JavaScript
- 突破 DockerHub 限制,全映象加速服務Docker
- 突破限制CSS font-variation可變字型的魅力CSS
- 突破限制,CSS font-variation 可變字型的魅力CSS
- 微信小程式如何突破模板訊息限制,獲取多個formId?微信小程式ORM
- yd電商行業怎樣才能突破私域增城行業
- C++ 突破私有成員訪問限制C++
- Android 突破 DEX 檔案的 64K 方法數限制Android
- 突破瀏覽器域名併發限制的解決方案瀏覽器
- TypeScript 中限制物件鍵名的取值範圍TypeScript物件
- 使用萬用字元證書可有什麼限制字元
- 每日 30 秒 ⏱ 字元編碼排雷錄字元
- 標準庫unsafe:帶你突破golang中的型別限制Golang型別
- 日本住宅IP的威力:突破地域限制,暢享日本資源
- 日本住宅IP的魅力:突破地域限制,暢遊日本網站網站
- 突破Android P(Preview 1)對呼叫隱藏API限制的方法AndroidViewAPI
- 字元流中第一個不重複的字元字元
- 一名個人開發者,怎樣做出登陸Xbox Series X的獨佔遊戲?遊戲
- 第3章-17 刪除字元 (30分)字元
- 怎樣生成一個好的詞向量
- go 突破訪問限制,訪問其他包中的私有變數Go變數
- 突破Android P非SDK API限制的幾種程式碼實現AndroidAPI
- 突破技術限制,實現Web端靜默列印Web
- 直播軟體開發,限制富文字框輸入的字元數上限字元
- 在Linux中,有一個檔案,如何刪除包含“www“字樣的字元?Linux字元
- 這個長得和 a 一模一樣,但是卻不是 a的字元是什麼字元
- 榮耀手錶S1怎麼樣?榮耀手錶S1全面評測:長續航、夠輕便
- 華為P30與華為P30 Pro拍照評測:華為P30/P30 Pro拍照怎麼樣?
- 怎樣選擇優質的蘋果企業簽名服務蘋果
- ABAP--一個讀取EXCEL單元格的內容超過256個字元的程式碼樣例Excel字元
- 如何用 30s 給面試官講清楚跳錶面試
- 劍指Offer 字元流中第一個不重複的字元字元