資料庫基礎之建表方式

2021-08-21 10:10:00 字數 2547 閱讀 9459

初學者在學習資料庫的建表語句的時候一般可能只了解一種建表語句,沒有接觸到其他方式的建表語句。

個人總結出一般我們建表是有四種建表方式,四種建表方式各有優點和缺點,我們慢慢說明。

第一種:一般情況建立表

在一般開發中建立表時採用的語句:       

create table test.t_emp(

eid number(5),

ename varchar2(10),

hiredate date default trunc(sysdate),

sal number(7,2),

comm number(7,2) default 0.03);

這是最常用的建表方式,定義表名,每個字段以及欄位的型別,大小,各種約束條件,主鍵等,依據語法定義。只要在設計上和語法上沒有錯誤,就會建立一張相應的表。建立之後就可以對錶進行插入資料等操作,在一般建立資料表時都採用的是這種方式。具體的語法這裡就不在詳細介紹了。

第二種:依據查詢結果建立新錶

create table t_emp_copy as(

select *from

test.t_emp

where 1=2);

這種方式是依據子查詢出來的結果,將結果的資料結構作為新錶的結構進行新錶建立。並且將子查詢的結果一次匯入新建立的表中。

注意:所建的表雖然完全是之前表的副本,他們的定義和包含的行完全相同。列上的所有not null(非空)

和check(檢查)約束也應用到新的表,但所有的primary key,unique或者foreign key約束則不適用

(因為這三類約束需要索引),所以在使用這種方式時要注意約束條件和序列是否符合你的新錶,比如新表有主鍵,你使用這種建立表的方式後,就必須另寫sql語句來新增主鍵約束,其他約束也是這樣的。

優點:1.在新建表的時候不需要詳細的考慮每個欄位的資料型別,長度。直接依據子查詢結果得字段來進行欄位的設計,這樣節省了在寫定義欄位的語句。

2.在建立表結構的同時,會將子查詢得到的資料匯入新建的表中,不需要以後再插入大量的資料進去,節省時間。

缺點:1.在新建的表的結構上和子查詢得出的字段的字段結構是不完全相同的,只有欄位的型別,長度一樣。子查詢得到的字段的約束是不會在新錶中建立出來的,所以一旦要求新錶的約束條件多了,這種方式建立出來的新錶明顯和你想要的表的結構有很大的差別,這時這種方法要慎用。

應用場景:比如在資料備份,比如在建立乙個新的業務表,這張表的資料會有其他已經存在的表的資料,這時依據資料庫原有資料建立新錶就很方便了。

第三種:建立事務級的臨時表

oracle資料庫除了可以儲存永久表外,還可以建立臨時表temporary tables。這些臨時表用來儲存乙個會話session的資料,

或者儲存在乙個事務中需要的資料。當會話退出或者使用者提交commit和回滾rollback事務的時候,臨時表的資料自動清空,

但是臨時表的結構以及元資料還儲存在使用者的資料字典中。

臨時表只在oracle8i以及以上產品中支援。 

oracle臨時表分為會話級臨時表 和 事務級臨時表。

會話級臨時表是指臨時表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,oracle自動清除臨時表中資料。

事務級臨時表是指臨時表中的資料只在事務生命週期中存在。當乙個事務結束(commit or rollback),oracle自動清除臨時表中資料。

臨時表中的資料只對當前session有效,每個session都有自己的臨時資料,並且不能訪問其它session的臨時表中的資料。因此,

臨時表不需要dml鎖.當乙個會話結束(使用者正常退出 使用者不正常退出 oracle例項崩潰)或者乙個事務結束的時候,oracle對這個會話的表執行 truncate 語句清空臨時表資料.但不會清空其它會話臨時表中的資料.

你可以索引臨時表和在臨時表基礎上建立檢視.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效. 

臨時表可以擁有觸發器.   

session級的臨時表,只有在truncate table、session結束才能釋放對錶的鎖定,等所有session釋放bounding臨時表,才能drop臨時表;否這會報ora-14452: 試圖建立, 更改或刪除正在使用的臨時表中的索引。

臨時表需要drop才能去掉其定義。

臨時表不產生redo、undo資訊。

臨時表各個session間的資料是不可見的,只能看到自己session的資料。

建立事務級臨時表:

create global temporary ()

on commit delete rows;

第四種:建立會話級的臨時表

create global temporary ()

on commit preserve rows;

可以對臨時表建立索引,檢視,出發器,可以用export和import工具匯入匯出表的

定義,但是不能匯出資料。表的定義對所有的會話可見。

mysql資料庫基礎建庫與建表

新建資料庫 create database name 有分號,name為資料庫名,不能重名,首字母不能為數字和 create database name charset utf8mb4 clooate utf8mb4 general ci 查詢和選擇資料庫 show databases use na...

django資料庫之建表

首先了解幾個知識 什麼是一對多,多對多,一對一 什麼是關聯查詢 什麼是主表,什麼是從表 外來鍵放的位置 正向查詢,反向查詢 各種設計模式下,怎麼查詢 一對多 班級表和學生表 乙個班級可以有多個學生,乙個學生屬於那個班級 一對一 學生表和學生資訊表 每個學生對應各自的學生資訊 多對多 學生表和課程表 ...

資料庫建表

資料庫設計三大正規化 為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一...