Oracle的二維表管理
Oracle數據庫表的字段類型說明
Oracle常用的數據類型主要有
數據類型 參數 描述
char(n) n=1 to 2000字節 定長字符串,n字節長,如果不指定長度,缺省的話為1個字節長(一個漢字是連個字節)
varchar2(n) n=1 to 4000字節 可變長的字符串,具體定義時指明最大長度n
number(m,n) m=1 to 38 n=-84 to 127 可變長的數值列,允許0、正值及負值,m是所有有效數字的位數,n是小數點之后的位數,如果實際位數超出了位數限制就會被截取多余的位數
date 無 從公元前4712年1月1日到公元4712年12月31日的所有合法日期
long 無 可變長字符列,最大長度限制是2GB,用於不需要作字符串搜索的長串數據,如果要進行字符搜索就要用varchar2類型。
raw(n) n=1 to 2000 可變長二進制數據,在具體定義字段的時候必須指明最大長度n,Oracle 8i用這種格式來保存較小的圖形文件或帶格式的文本文件,如Miceosoft Word文檔。
blob clob nclob 無 三種大型對象(LOB),用來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件,最大長度是4GB。LOB有幾種類型,取決於你使用的字節的類型,Oracle 8i實實在在地將這些數據存儲在數據庫內部保存。可以執行讀取、存儲、寫入等特殊操作。
bfile 無 在數據庫外部保存的大型二進制對象文件,最大長度是4GB。這種外部的LOB類型,通過數據庫記錄變化情況,但是數據的具體保存是在數據庫外部進行的。Oracle 8i可以讀取、查詢BFILE,但是不能寫入。大小由操作系統決定
char和varchar2的比較
varchar2類型(底層需要做一次判斷):varchar2(ln) ln表示字符最大長度實際存儲內存長度是根據字符大小來分配,但是最大不能超過ln
char類型(底層不需要判斷):char(ln) 不管字符數據大小是多大,直接開辟ln大小的空間存儲數據
總結:varchar2的特點是:動態分配內存空間,節省空間,char的特點是:存儲效率高於 varchar2,所以小型數據可以選擇 char,比較大型的數據建議使用 varchar2
Oracle二維表的創建
創建二維表,下面給了一個最簡單的無任何約束的創建數據庫表的示例
create table student(
sno number(10,2), -- sno 數值類型只有 number 最多10位 小數占2位
sname varchar2(100),
sage number(3),
ssex char(4), -- char varchar2 都代表是string的類型
sfav varchar2(500),
sbirth date
)
1
2
3
4
5
6
7
8
在了解了簡單數據庫表的創建之后,接下來學習數據庫表的多種約束,在下面列出來的種種約束的創建都是可以通過SQL以及PL/SQL兩種方式來完成的,首先介紹SQL命令方式,之后再補充簡單的PL/SQL的操作
主鍵約束
主鍵:在數據庫表中唯一非空的字段便可以定義為主鍵,在一張表中可以定義為主鍵的字段是唯一的,接下來介紹三種添加主鍵以及一種刪除主鍵的方式
直接在創建表的時候添加主鍵約束,具體如下
create table student(
sno number(10,2) primary key, -- 注意是添加在逗號前面
sname varchar2(100),
sage number(3),
ssex char(4),
sfav varchar2(500),
sqq varchar2(30) -- 最后一行沒有逗號
)
1
2
3
4
5
6
7
8
在聲明數據庫表格結構的最后一行聲明主鍵約束,具體如下
語法: constraints 約束名稱 primary key(主鍵名稱)
注意:在這里的約束名稱當執行SQL有問題時會被提示出來,一般約束名稱的命名規則是 約束類型的簡寫(pk,ck,un)_數據表名_字段名
create table student(
sno number(10,2) ,
sname varchar2(100),
sage number(3),
ssex char(4),
sfav varchar2(500),
sqq varchar2(30), --注意此時應該加上逗號
constraints pk_student_sno primary key(sno)
)
1
2
3
4
5
6
7
8
9
10
11
在創建表之后使用 alter table語句給對應表設置約束,具體如下
alter table student add constraints pk_student_sno primary key(sno);
1
刪除主鍵約束,這里同樣使用 具體如下
alter table student drop constraints pk_student_sno;
1
非空約束
非空約束是指對於數據庫表中的特定字段,應該不能輸入空值,添加非空約束同樣也是可以三種方式以及一種方式的刪除約束
直接在創建表的時候添加非空約束
sname varchar2(100) not null, ----添加非空約束
1
在聲明數據庫表格結構的最后一行聲明非空約束,具體如下
constraints ck_student_sname check(sname is not null)
1
在創建表之后使用 alter table語句給對應表設置約束,具體如下
alter table student add constraints ck_student_cname check(sname is not null)
1
刪除主鍵約束,這里同樣使用 具體如下,具體如下
alter table student drop constraints ck_student_cname;
1
檢查約束
檢查約束只要是指給特定字段添加限制,比如年齡必須是在特定范圍內,性別只能是男女等
直接在創建表的時候添加非空約束,具體如下
sage number(3) check(sage>0 and sage<150),
ssex char(4) check(ssex='男' or ssex='女'),
1
2
在聲明數據庫表格結構的最后一行聲明主鍵約束,具體如下
constraints ck_student_sage check(sage>0 and sage <200),
constraints ck_student_ssex check(ssex='男' or ssex='女'),
1
2
在創建表之后使用 alter table語句給對應表設置約束,具體如下
alter table student add constraints ck_student_sage checkcheck(sage>0 and sage<150);
alter table student add constraints ck_student_sex check(ssex='男' or ssex='女')
1
2
刪除主鍵約束,這里同樣使用 具體如下,具體如下
alter table student drop constraints ck_student_sage
alter table student drop constraints ck_student_sex;
1
2
唯一約束
唯一約束是指在這個字段中,每個值都應該是互不相同的
直接在創建表的時候添加非空約束,具體如下
sqq varchar2(30) unique,
1
在聲明數據庫表格結構的最后一行聲明主鍵約束,具體如下
constraints un_student_qq unqiue(qq)
1
在創建表之后使用 alter table語句給對應表設置約束,具體如下
alter table student add constraints un_student_qq unique(qq)
1
刪除主鍵約束,這里同樣使用 具體如下,具體如下
alter table student drop constraints un_student_qq
1
外鍵約束
外鍵的概念:當一張表的某個字段的值需要依賴另外一張某個表的某個字段的值,則使用外鍵約束,其中主動依賴的表稱為子表,被依賴的表稱為父表,外鍵加在子表中。例如如下兩張表格,學生表中需要課程表的課程號,且不能添加不存在的課程號信息到學生表中,這種情況便可以設置外鍵約束。
--創建學生表(子表)
create table student(
sno number(10) primary key,
sname varchar2(100) not null,
sage number(3) check(sage>0 and sage<150),
ssex char(4) check(ssex='男' or ssex='女'),
sfav varchar(500),
sqq varchar2(30) unique,
cno number(10)
)
--創建班級表格(父表)
create table class(
cno number(10) primary key,
cname varchar2(100) not null,
cdesc varchar2(300)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
其中一般選取父表的主鍵作為子表的外鍵,且外鍵與主鍵名稱不必相同
直接在創建表的時候添加非空約束,具體如下
cno number(10) references class(cno),
1
在聲明數據庫表格結構的最后一行聲明主鍵約束,具體如下
constraints fk_student_cid foreign key(cid) references class(cno)
1
在創建表之后使用 alter table語句給對應表設置約束,具體如下
alter table student add constraints fk_student_cid foreign key(cno) references class(cno)
1
刪除主鍵約束,這里同樣使用 具體如下,具體如下
alter table student drop constraints fk_student_cid
1
外鍵約束優化
有外鍵約束的數據表在刪除時會因為存在外鍵約束導致數據刪除失敗,這時需要優化數據表的外鍵設置
使用 on delete cascade關鍵字 級聯刪除,缺點是級聯刪除會將有關聯的數據一起刪除,比如完成如下設置以后,假如刪除 class表中的1班級,student表中的班級號為1的也將全部刪除
alter table student add constraints fk_student_cid foreign key(cno) references class(cno) on delete cascade;
1
使用 on delete set null關鍵字,刪除父表數據時 將子表中的依賴字段的值設置為null,因此子表依賴的字段不能設置非空約束
alter table student add constraints fk_student_cid foreign key(cno) references class(cno) on delete set null;
1
總結
這一篇博客的主要內容是了解Oracle主要數據類型的含義以及添加約束的三種方法,重點了解約束類型:主鍵約束,非空約束,檢查約束,唯一約束以及數據表中中外鍵的設置。
---------------------