oracle 表(上)


  

  對於我們初學者來說,對表的概念也有一定的認識。因為我們對數據庫的操作,90%以上是對表的操作。

 

常見表的類型:

 

 

  規則表(Regular table),嚴格意義上來說又叫heap table(堆表),也就是我們最普通的一張表。

  partition talbeIndex-organized table、Cluster 三種表類型,在講解數據結構的時候有做過簡單的描述,這里就不介紹,本節的重點也就是講解普通的表。

 


 

  對於一張普通的表,他的插入規則是無序,我們把數據的存儲空間看成學生宿舍樓一個連一個的房間。並不是第一個來的人就一定先在第一個房間。先來的人只要發現某個房間還有床位是空的就可以入住。

  那么我們如何讓他變成的有序的呢?那么我可以專業創建一列來記錄順序。宿管在一樓門口發號碼,進來一同學,發一個號碼,上面標注幾號房間幾號床位。這樣所有入住的同學都是有序的。

SQL> create table t
  2  (a int,
  3  b varchar2(4000) default rpad('*',4000,'*'),
  4  c varchar2(3000) default rpad('*',3000,'*'));    //創建一個表

Table created.

SQL> insert into t(a) values(1);

1 row created.

SQL> insert into t(a) values(2);

1 row created.

SQL> insert into t(a) values(3);   //插入若干條記錄

1 row created.
.........
SQL> select a from t;

         A
----------
         3
         1
         4
         5
         2
//上面查詢插入的結果是無序的,如何變成的有序的呢? 加上 order by 
SQL> select a from t order by a;

         A
----------
         1
         2
         3
         4
         5

  我們可以在表中添加一列用來記錄行號,每添加一條數據自動加1。這樣就有效保證插入有數據是有序列的。

 

 

表的字段類型划分                                           

 

oracle表類型結構圖:

 

  Oracle數據類型分用戶自定義類型(user-defined)和內嵌類型(built-in,但我們大多時候都用內嵌類型,在極特別情況下才會用到自定義類型。

  內嵌類型可以用為三大類,scalar翻譯成標量,可以理解成單一的數據類型,collection 收集,這里可以理解為復合的類型,relationship 關系類型,類似於指針引用。而我們一般最常用的也就是scalar數據類型。

Scalar又可以分為四類:

字符串型char(n)nchar(n)varchar2(n)nvarchar2(n)、、

數值型number(p,s)

日期型datatimestamp

二進制類型raw(n)blogclobnclobbfilelonglong raw

記錄編號rowidurowid

 

 

CHAR & VARCHAR2類型存儲比較                          

 

  char(n) n=1 to 2000字節 定長字符串,n字節長,如果不指定長度,缺省為1個字節長(一個漢字為2字節)。 

  varchar2(n) n=1 to 4000字節 可變長的字符串,具體定義時指最大長度n,這種數據類型可以放數字、字母以及ASCII碼字符集(或者EBCDIC等數據庫系統接受的字符集標准)中的所有符號。如果數據長度沒有達到最大值n,Oracle 8i/9i/10g會根據數據大小自動調節字段長度,如果你的數據前后有空格,Oracle 8i會自動將其刪去。VARCHAR2是最常用的數據類型。

 

Varchar2 相比於char 在大數據的存儲中就有效果的節約了很多空間。

Nchar、Nvarchar2分別是 char 與varchar2的國際版。

 

 

Rowid 字段類型                                                                     

 

Rowid 是一行數據的一個唯一標識。

下面來做個例子,來幫助我們認識它:

SQL> sreate table f(id int,name char(10));    //創建一個表
Table created.
SQL> insert into f values(0,'boobooke');    //插入幾條相同人數據

1 row created.

SQL> select * from f;    //查看表內容

        ID NAME
---------- --------------------
         0 boobooke
         0 boobooke
         0 boobooke

SQL> select rowid,id,name from f;    //查看rowid隱藏列

ROWID                      ID         NAME
------------------ ---------- -----------------------------------------
AAAMiXAABAAAOjKAAA          0    boobooke
AAAMiXAABAAAOjKAAB          0    boobooke
AAAMiXAABAAAOjKAAC          0    boobooke

 

  Rowid是一個隱藏的字段,每一張表都存在,默認查看一張數據的時候不會出現。只有特意加上rowid字段才會出現。

 

Rowid的結構:

需要聲明一下的是,現在的格式是9i 及以后版本的格式。

6位(OOOOOO)為數據對象ID,一張表、一個所引都是一個數據對象,oracle都會分配給他們一個唯一的數據對象。

緊跟的3位(FFF)為相對的文件ID,我們知道表空間是由不同的文件組成,對象存儲的某個文件里,每個文件會對應一個ID

再接着的6位(BBBBBB)為塊ID ,文件是由塊組成的,每個塊也有一個唯一的ID編號。

最后3位(RRR)為行ID ,每個塊又可划分成行,每個行也有一個ID號。

 

 

其他類型介紹                                        

 

1  number(m,n) m=1 to 38,n=-84 to 127 可變長的數值列,允許0、正值及負值,m是所有有效數字的位數,n是小數點以后的位數。如:number(5,2),則這個字段的最大值是99999,如果數值超出了位數 限制就會被截取多余的位數。如:number(5,2),但在一行數據中的這個字段輸入575.316,則真正保存到字段中的數值是575.32。如:number(3,0),輸入575.316,真正保存的數據是575。  

 

2  date 無 從公元前4712年1月1日到公元4712年12月31日的所有合法日期,Oracle 8i/9i/10g其實在內部是按7個字節來保存日期數據,在定義中還包括小時、分、秒。缺省格式為DD-MON-YY,如07-11月-00 表示  2000年11月7日。  

 

3  Long:可變長字符列,最大長度限制是2GB,用於不需要作字符串搜索的長串數據,如果要進行字符搜索就要用varchar2類型。

    long是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。  

 

4  raw(n) n=1 to 2000 可變長二進制數據,在具體定義字段的時候必須指明最大長度n,Oracle 8/9i用這種格式來保存較小的圖形文件或帶格式的文本文件,如Miceosoft Word文檔, 以及音頻、視頻等非文本文件。

    raw是一種較老的數據類型,將來會逐漸被BLOB、NCLOB等大的對象數據類型所取代。  

 

5  long raw 可變長二進制數據,最大長度是2GB。Oracle 8i/9i用這種格式來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件。

    在同一張表中不能同時有long類型和long raw類型,long raw也是一種較老的數據類型,將來會逐漸被BLOB、NCLOB等大的對象數據類型所取代。  

 

6  blob clob nclob

三種大型對象(LOB),用來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件,最大長度是4GB。LOB有幾種類型,取決於你使用的字段的類型,Oracle 9i/10g實實在在地將這些數據存儲在數據庫內部保存。可以執行讀取、存儲、寫入等特殊操作。  

 

7  bfile 無 在數據庫外部保存的大型二進制對象文件,最大長度是4GB。這種外部的LOB類型,通過數據庫記錄變化情況,但是數據的具體保存是在數據庫外部進行的。Oracle 8i/9i/10g可以讀取、查詢BFILE,但是不能寫入。大小由操作系統決定。

 

8  LONG型:此數據類型用來存儲可變長度的字符數據,最多能存儲2GB。但是有一些限制:一個表中只有一列可以為LONG型,LONG列不能定義為主鍵或唯一約束,不能建立索引,過程或存儲過程不能接受LONG數據類型的參數。

 

9  LOB數據類型

● LOB又稱為“大對象”數據類型:主要有CLOB,BLOB(NBLOB),BFILE,三種子類型。

● CLOB代表(CHARACTER LOB),它能夠存儲大量字符數據,可以存儲非結構化的XML文檔。

● BLOB代表(BINARY LOB),它可以存儲較大的二進制對象;如圖形,音視頻剪輯。

 

 

關於表的一些信息                                  

  

  Oracle規定一張表最多可以有1000列,但一般在我們設計表的時候根本不需這么多列,如果你真這么干了,很有可能你的設計不合理,要么就是極其特別的情況下需要這么做。對一個表的列數設計的越少,oracle 對表的操作性能越高。如果表的列數超過254列的時候,oracle在存放的時候分多個行片(row pieces),當你在讀的時候,oracle將這些生片重新組裝產生一個完整的列。

  Oracle對一張表存儲的行數沒有限制,理論上是無限的。但我們會受到其它的限制,如磁盤空間、內存等。例如,一個表這空間最多可以包含1022個文件(當然,oracle10g中有一個BIGFILE 表空間使文件的數量大大增加,超過了1022的限制)假設你的每個文件是32GB,那一個表空間可以放32*1022=32704GB ,這將是2143289344個數據塊,假設第個塊16KB,一個塊可以放160條記錄,一行80100個字節,那么一個表空間可存放342926295040行數據。Oracle還提供了分區表的功能,一個表可以拆分成1024個分區表,那么最大值是1024*342926295040行數據。這只是個理論最大值。

  索引是依附於表的,索引就是把不同列組合起來。在一張表中創建所引的個數理論上是無限的。

  那么一個數據庫可以放多少張表?這個理論上也是無限,但一個數據庫中不可能有上百萬張表,這樣對於創建與維護幾乎是不可能的。但對於大型數據庫來說有幾千張表是完全可能。

一列數據在數據塊中的存儲:

 

Row header :存儲一行中有多少行的信息,鏈接信息和 行鎖的信息。

Column length : 用來存儲列的長度。

Column value : 用來存儲列的值。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM