1、一致性
一致性包括not null、unique、check
a)Not null
name varchar(20) not null
b)Unique
若是A1, A2...等構成了候選鍵,能夠用unique(A1, A2...)來保證其惟一性,但這些字段仍然可爲空,而爲空值與任何值都不相等。
c)Check
限制semester的值:
check (semester in (’Fall’, ’Winter’, ’Spring’, ’Summer’)
d)Referential Integrity參照完整性
若是course.dept_name做爲外鍵引用department表,爲了保證course.dept_name的取值都存在於department.dept_name,添加參照完整性約束爲:
e)foreign key (dept name) references department
2、數據類型和Schemas
a)Date和time
SQL標準規定的time相關類型有:
date ’2001-04-25’
time ’09:30:00’
timestamp ’2001-04-25 10:29:01.45’
字符串形式的日期可使用cast e as t的方式來轉換;也可使用extract year/month/day/hour/minute/second from d的方式來單獨提取年月日等數據;
還有current_day, current_timestamp(包含時區), localtimestamp(不包含時區的本地時間);
interval類型表示時間的差
b)Default value
create table student
(ID varchar (5),
name varchar (20) not null,
dept name varchar (20),
tot_cred numeric (3,0) default 0,
primary key (ID));
這裏設置了tot_cred的默認值爲0
c)建立索引
create index studentID index on student(ID)表示建立了名爲studentID的索引,有的數據庫產品又進一步區分了彙集索引(clustered)與非彙集索引(nonclustered)
d)大對象類型Large-Object Type
若是要存儲聲音、圖像等數據,數據量可能爲KB甚至MB, GB級別,爲此SQL提供了兩種大對象類型 clob(character large object)和blob(binary...)。不一樣數據庫的具體實現會有區別,並且實際使用中不推薦使用這些類型,而每每將數據保存在文件系統,並在數據庫保存其存放位置。
e)用戶自定義類型
容許基於現有的類型來自定義數據類型,好比:
create type Dollars as numeric(12,2);
create type Pounds as numeric(12,2);
自定義類型Dollars和Pounds雖然都是numeric(12,2)類型,但在業務上被認爲是不一樣的數據類型。
還有一種定義方式爲:
create domain DDollars as numeric(12,2) not null;
type和domain的細微的區別在於domain能夠同時添加約束如not null,;並且domain也不是徹底的強類型,只要值是兼容的,就能夠賦值給domain定義的類型,而type卻不行。
e)Create table的擴展
create table temp instructor like instructor;建立了一個與sinstructor有相同結構的表
在編寫SQL時,有時會建立臨時表並存入數據,這時能夠用簡化寫法:
create table t1 as
(select *
from instructor
where dept name= ’Music’)
with data;
t1表結構與查詢結果集相同,若是去掉with data,則只建立schema而不插入數據。
3、受權
權限控制能夠針對用戶或角色進行數據操縱、schema更新等的控制。
a)分配、撤銷受權
分配權限的語法爲:
grant <privilege list>
on <relation name or view name>
to <user/role list>;
privilege list包括select, insert, update, delete
對於update,能夠設定容許更新某些屬性:
grant update (budget) on department to Amit, Satoshi;
相似地,撤銷受權語法爲:
revoke <privilege list>
on <relation name or view name>
to <user/role list>;
b)角色
基於角色的權限控制不是SQL的專利,不少共享型應用都採用這種受權方式。
create role instructor;
grant select on takes to instructor;
grant dean to Amit;
前面的語句建立了角色instructor,爲期分配select from takes權限,而後將Amit納入instructor角色。在Amit執行查詢前,SQL根據它所屬角色具備的權限來作控制。
c)關於schema的受權
由於外鍵會影響後續的更新、刪除等操做,因此有必要爲外鍵的建立作權限控制:
grant references (dept name) on department to Mariano;
學習資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan
數據庫