oracle9
約束
維護數據的完整性 數據的完整性用于確保數據庫數據遵從一定的商業和邏輯規則(比如年紀不能為-1,性別不能為非男女),在oracle中,數據完整性可以使用約束、觸發器、應用程序(過程、函數)三種方法來實現,在這三種方法中,因為約束易于維護,并且具有最好的性能,所以作為維護數據完整性的首選。 約束
約束用于確保數據庫數據滿足特定的商業規則。在oracle中,約束包括:not null、 unique, primary key, foreign key,和check五種。 使用 not null(非空)
如果在列上定義了not null,那么當插入數據時,必須為列提供數據。 unique(唯一)
當定義了唯一約束后,該列值是不能重復的,但是可以為null。 primary key(主鍵)
用于唯一的標示表行的數據,當定義主鍵約束后,該列不但不能重復而且不能為null。
需要說明的是:一張表最多只能有一個主鍵,但是可以有多個unqiue約束。 foreign key(外鍵)
用于定義主表和從表之間的關系。外鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique約束,當定義外鍵約束后,要求外鍵列數據必須在主表的主鍵列存在或是為null。 check
用于強制行數據必須滿足的條件,假定在sal列上定義了check約束,并要求sal列值在1000-2000之間如果不在1000-2000之間就會提示出錯。 商店售貨系統表設計案例
現有一個商店的數據庫,記錄客戶及其購物情況,由下面三個表組成:商品goods(商品號goodsId,商品名 goodsName,單價 unitprice,商品類別category,供應商provider);
客戶customer(客戶號customerId,姓名name,住在address,電郵email,性別sex,身份證cardId);
購買purchase(客戶號customerId,商品號goodsId,購買數量nums);
請用SQL語言完成下列功能:
1. 建表,在定義中要求聲明:
(1). 每個表的主外鍵;
(2). 客戶的姓名不能為空值;
(3). 單價必須大于0,購買數量必須在1到30之間;
(4). 電郵不能夠重復;
(5). 客戶的性別必須是 男 或者 女,默認是男; SQL> create table goods(goodsId char(8) primary key, --主鍵 goodsName varchar2(30), unitprice number(10,2) check(unitprice>0), category varchar2(8), provider varchar2(30) );
SQL> create table customer( customerId char(8) primary key, --主鍵 name varchar2(50) not null,? --不為空 address varchar2(50), email varchar2(50) unique, sex char(2) default '男' check(sex in ('男','女')), -- 一個char能存半個漢字,兩位char能存一個漢字 cardId char(18) );
SQL> create table purchase( customerId char(8) references customer(customerId), goodsId char(8) references goods(goodsId), nums number(10) check (nums between 1 and 30) );
表是默認建在SYSTEM表空間的 維護 商店售貨系統表設計案例(2)
如果在建表時忘記建立必要的約束,則可以在建表后使用alter table命令為表增加約束。但是要注意:增加not null約束時,需要使用modify選項,而增加其它四種約束使用add選項。
1. 增加商品名也不能為空
SQL> alter table goods modify goodsName not null;
2. 增加身份證也不能重復,給cardId增加一個唯一性約束
SQL> alter table customer add constraint 約束名稱 unique(cardId);
3. 增加客戶的住址只能是’海淀’,’朝陽’,’東城’,’西城’,’通州’,’崇文’,’昌平’;
SQL> alter table customer add constraint 約束名稱 check (address in (’海淀’,’朝陽’,’東城’,’西城’,’通州’,’崇文’,’昌平’)); 刪除約束
當不再需要某個約束時,可以刪除。
alter table 表名 drop constraint 約束名稱;
特別說明一下:
在刪除主鍵約束的時候,可能有錯誤,比如:
alter table 表名 drop primary key;
這是因為如果在兩張表存在主從關系,那么在刪除主表的主鍵約束時,必須帶上cascade選項 如像:
alter table 表名 drop primary key cascade; 顯示約束信息
1.顯示約束信息
通過查詢數據字典視圖user_constraints,可以顯示當前用戶所有的約束的信息。
select constraint_name, constraint_type, status, validated from user_constraints where table_name = '表名';
2.顯示約束列
通過查詢數據字典視圖user_cons_columns,可以顯示約束所對應的表列信息。
select column_name, position from user_cons_columns where constraint_name = '約束名';
3.當然也有更容易的方法,直接用pl/sql developer查看即可。簡單演示一下下... 表級定義 列級定義 列級定義
列級定義是在定義列的同時定義約束。
如果在department表定義主鍵約束(constraint pk_department primary key
為主鍵約束primary key取了一個名字pk_department,如果直接寫dept_id number(12) primary key則會隨機取一個名字)
create table department4(
dept_id number(12) constraint pk_department primary key, name varchar2(12), loc varchar2(12)
); 表級定義 表級定義是指在定義了所有列后,再定義約束。這里需要注意: not null約束只能在列級上定義。 以在建立employee2表時定義主鍵約束和外鍵約束為例(pk_employee為約束名): create table employee2(
emp_id number(4), name varchar2(15), dept_id number(2),
constraint pk_employee primary key (emp_id), constraint fk_department foreign key (dept_id) references department4(dept_id)
);
dept_id number(12) constraint pk_department primary key, name varchar2(12), loc varchar2(12)
); 表級定義 表級定義是指在定義了所有列后,再定義約束。這里需要注意: not null約束只能在列級上定義。 以在建立employee2表時定義主鍵約束和外鍵約束為例(pk_employee為約束名): create table employee2(
emp_id number(4), name varchar2(15), dept_id number(2),
constraint pk_employee primary key (emp_id), constraint fk_department foreign key (dept_id) references department4(dept_id)
);
?
Oracle索引、權限 索引需要另外存放,用于查找書籍。?
索引是用于加速數據存取的數據對象。合理的使用索引可以大大降低i/o次數,從而提高數據訪問性能。索引有很多種我們主要介紹常用的幾種: 為什么添加了索引后,會加快查詢速度呢? 創建索引 單列索引是基于單個列所建立的索引,比如: create index 索引名 on 表名(列名); 復合索引 復合索引是基于兩列或是多列的索引。在同一張表上可以有多個索引,但是要求列的組合必須不同,比如: create index emp_idx1 on emp (ename, job); //相當于建立了書的小卡片,先按照ename去查再按照job去查 create index emp_idx1 on emp (job, ename); //先按照job去查再按照ename去查 使用原則 使用原則 1. 在大表上建立索引才有意義 2. 在where子句或是連接條件上經常引用的列上建立索引 3. 索引的層次不要超過4層 這里能不能給學生演示這個效果呢? 如何構建一個大表呢? 索引的缺點 索引缺點分析 索引有一些先天不足: 1. 建立索引,系統要占用大約為表1.2倍的硬盤和內存空間來保存索引。 2. 更新數據的時候,系統必須要有額外的時間來同時對索引進行更新,以維持數據和索引的一致性。 實踐表明,不恰當的索引不但于事無補,反而會降低系統性能。因為大量的索引在進行插入、修改和刪除操作時比沒有索引花費更多的系統時間。 比如在如下字段建立索引應該是不恰當的: 1. 很少或從不引用的字段; 2. 邏輯型的字段,如男或女(是或否)等(因為男女就2種,即使經常用到也不加索引,比如書籍就文學類和理工類,那么就不必要做一個卡片區分文學還是理工)。 綜上所述,提高查詢效率是以消耗一定的系統資源為代價的,索引不能盲目的建立,這是考驗一個DBA是否優秀的很重要的指標。?
其它索引 按照數據存儲方式,可以分為B*樹、反向索引、位圖索引; 按照索引列的個數分類,可以分為單列索引、復合索引; 按照索引列值的唯一性,可以分為唯一索引和非唯一索引。 此外還有函數索引,全局索引,分區索引... 對于索引我還要說: 在不同的情況,我們會在不同的列上建立索引,甚至建立不同種類的索引,請記住,技術是死的,人是活的。比如: B*樹索引建立在重復值很少的列上,而位圖索引則建立在重復值很多、不同值相對固定的列上。 顯示索引信息 顯示表的所有索引 在同一張表上可以有多個索引,通過查詢數據字典視圖dba_indexs和user_indexs,可以顯示索引信息。其中dba_indexs用于顯示數據庫所有的索引信息,而user_indexs用于顯示當前用戶的索引信息: select index_name, index_type from user_indexes where table_name = '表名'; 顯示索引列 通過查詢數據字典視圖user_ind_columns,可以顯示索引對應的列的信息 select table_name, column_name from user_ind_columns where index_name = 'IND_ENAME'; 你也可以通過pl/sql developer工具查看索引信息?
轉載于:https://www.cnblogs.com/yaowen/p/4857230.html
總結
- 上一篇: The temporary upload
- 下一篇: 第四章 软件项目进度管理