?? oracle(day4).txt
字號:
一、約束
約束是針對表中的字段進行定義的。
primary key (主鍵約束 PK)保證實體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,并且每一個表中只能有一個主鍵,有兩個字段聯(lián)合作為主鍵,只有兩個字段放在一起唯一標識記錄,叫做聯(lián)合主鍵。
foreign key (外建約束 FK)保證引用的完整性,
外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值得約束,不能夠取其他值,只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想創(chuàng)建子表,就要先創(chuàng)建父表,后創(chuàng)建子表,記錄的插入也是如此,先父表后子表,刪除記錄,要先刪除子表記錄,后刪除父表記錄,要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,后刪除父表。
unique key(唯一鍵),值為唯一
index(索引)是數(shù)據(jù)庫特有的一類對象,view(示圖)
典型的一對多 class 對應多個學生。
student table class table
______________________________ _________________________
| id | name | address| class_id| | id |class_desc|class_num|
|(PK)|______|________|___(FK)__| |(pk)|__________|_________|
| | | | | | | | |
一對一
student tabel shenfenzheng table
____________________ _________________________________
| id | name | address| | s_id |shenfen_desc|shenfen_num|
|(PK)|______|________| |(PK,F(xiàn)K)|____________|___________|
| | | | | | | |
多對多
student tabel zhongjian table kecheng table
____________________ _________________________________ __________________
| id | name | address| | s_id |shenfen_desc|shenfen_num| | kid | kechengname|
|(PK)|______|________| |(FK,F(xiàn)K)|____________|___________| | (PK)|____________|
| | | | |聯(lián)合主鍵| | | | | |
引用對方表的主鍵,當作本身的主鍵,所以這個表的主鍵,既是主鍵又是外建
建表和其他相關(guān)操作
DDL語句
創(chuàng)建表:
create table 表名 ( 字段名1 類型(數(shù)據(jù)長度)(default ...) 約束條件, 字段名2 類型(數(shù)據(jù)長度) 約束條件 );
Oracle數(shù)據(jù)庫中的數(shù)據(jù)類型
varchar(長度),可變長字符串,char(長度) 定長
number(..,..),number 表示浮點數(shù),或者是整數(shù)
long 大對象,clog 字符的大對象,相當于文本文件在表中只存放一個相當于只針對值
blog 二進制的大對象,也是以相當于指針的形式存放的。
primary key約束:
主鍵約束的定義:
第一種定義形式:
create table test(c number primary key ); 列級約束
第二種定義形式:
create table test(c number , primary key(c) ) ; 表級約束
create table test( c1 number constraints pkc1 primary key ); 此約束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表級約束可以實現(xiàn)聯(lián)合主鍵
foregin key (fk) 外鍵約束:
(先定義父表,再定義子表)
carete table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表級約束定義:
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
如果兩個字段都為唯一且非空,這時可以定義成UK+NOT NULL
(PK或UK)一對多(FK)
(PK+UK)一對一(FK) 或 (PK)一對一(PK)
多對對多關(guān)系,一般都通過一張中間表來分解成兩個一對多的表
建立表
create table[schema]table
schema: 一個用戶對應一個schema 不同用戶下的表不能互相查看
select count(*) from s_dept; <===> select count(*) from sd0611.s_dept;
一個表中只能存儲一個LONG類型
CLOB 存儲大的文本對象
BLOB 存儲大的二進制對象
create table test(c1 number primary key); 設置主鍵
create table test(c1 number constraints test_c1 primary key); 定義約束名,默認約束名為SYS_ 在列后面定義約束稱為列級約束
create table test(c1 number, primary key(c1)); 所有列定義完后再定義約束稱為表級約束(能定義聯(lián)合主鍵)
cretae table test(c1 number,c2 number,priary key(c1,c2)); 定義聯(lián)合主鍵
create table parent(c1 number primary key); 先要定義父表
create table child(c1 number primary key, c2 number references parent(c1)); 然后定義子表 references parent定義外鍵
create table child(c1 number primary key, c2 number references parent(c1) on delete cascate); on delete cascate為級聯(lián)刪除
create table child(c1 number primary key, c2 number references parent(c1) on delete set null); on delete set null刪除后將外鍵置空
create table child (c1 number primary key, c2 number,foreign key(c2) references parent(c1));
二,數(shù)據(jù)字典
數(shù)據(jù)字典是由系統(tǒng)維護的,包含的數(shù)據(jù)庫的信息
數(shù)據(jù)字典示圖
user_XXXXX 用戶示圖
all_XXXXX 所有示圖
dba_XXXXX 數(shù)據(jù)庫中所有示圖
v$_XXXXX 動態(tài)性能示圖
dist或 distionary 表示數(shù)據(jù)字典的數(shù)據(jù)字典。
user_constraints 用戶的表中約束的表
其中有constraints_name字段存放的是約束名,r_constraints_name字段表示外鍵引用pk或uk的名字
這兩個字段之間有自連接的關(guān)系,也就是約束名和外鍵約束名之間的自連接。
user_cons_column表,是用戶的列級約束表
三、DML操作
1、insert操作,插入記錄
insert into 表名 values(值1,值2,......);
注意這種方法插入記錄時,要對所有字段進行插入,沒有非空約束時,又不想插入值時,要用空值替代,并且要按照字段的順序插值(要清楚表結(jié)構(gòu)),且要注意數(shù)據(jù)類型一致。
insert into 表名(字段名1,字段名2,.....) values(值1,值2,......);
這種方法可以對指定的字段進行插入,不想插值的就可以不寫,前提是該字段沒有非空約束。
例:insert into student value(1,'xxx','xxx');
insert into student(id,name,address) value(1,'xxx','xxx');
注意:有空值的話:
隱式插入
INSERT INTO s_dept (id, name) VALUES (12, 'MIS');
不往想為空的字段中插數(shù)據(jù),系統(tǒng)默認為NULL
顯示插入
INSERT INTO s_dept VALUES (13, 'Administration', NULL);
select * from s_emp where 1=2; 這樣選不出紀錄,方便察看表結(jié)構(gòu)
2、update修改操作
update table 表名 set 字段名1=數(shù)據(jù)1或表達式1, 字段名2=數(shù)據(jù)2或表達式2
[where ....=....];
例:update shenfenzhen set num=99 where sid=2;
3、delete刪除操作
delete from 表名 [where ...=...];
例: delete from s_emp where sid=2;
用delete操作刪除的記錄可以通過 rollback命令回滾操作,會恢復delete操作刪除的數(shù)據(jù)。
delete操作不會釋放表所占用的空間,delete不適合刪除記錄多的大表。
delete操作會占用大量的系統(tǒng)資源。
四、事務
OLTP ( on line transaction procession ) 聯(lián)機事務處理
數(shù)據(jù)庫中操作的應是事務,而不是DML語句
事務是有生命周期的,commit;事務結(jié)束
系統(tǒng)中充滿了并發(fā)的transation,每個連接是一個session,每個操作都是一個transaction
DDL、DCL語句是自動提交的
sqlplus正常退出(exit),系統(tǒng)自動提交
上個事務的結(jié)束就是下個事務的開始
事務保證數(shù)據(jù)的一致性,保證原子操作的安全
一個沒有結(jié)束的事務,叫做活動的事務 (active transaction),活動的事務中修改的數(shù)據(jù),只有本會話才能看見。
readcommited,只可以讀取已經(jīng)作提交操作的數(shù)據(jù),本會話可以看到自己的所作的沒有提交的操作。
在活動事務中,當多個用戶同時對同一張表進行操作時,會對表加上表級共享鎖,當用戶對操作該表某一條記錄進行操作時會對該條記錄加上行級排它鎖,
只允許一個用戶對該條記錄進行DML操作,只有提交操作commit;或回滾操作rollback;時,才可讓其他用戶操作對該記錄進行DML操作,也就是釋放了該條
記錄的行級排它鎖。如果沒有提交操作或回滾操作,那么該用戶就不能對該條記錄加鎖,該用戶的DML操作就會進入等待狀態(tài),但是在對表作drop操作(DDL操作)時,
如果還有用戶在操作該表,也就是沒有釋放表級共享鎖,就會直接報錯。
事務越大,就會消耗更多的資源,并長時間持有事務會造成無法進行其他的操作,事物提交太頻繁的話,會對I/O造成很大的負擔,所以要合理確定事務的大小。
commit;提交操作,事物的結(jié)束
rollback;回滾操作,會將先前的活動事務中的操作(DML操作)的結(jié)果進行回滾,撤銷全部操作,恢復成事務開始時的數(shù)據(jù),也就是恢復成事務開始時的狀態(tài)。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -