資料庫複習⑧ 2016年6月18日 21:23 Main Integrity Constraints 實體完整性約束 1.各種約束 Keys Foreign-key 外鍵 引用完整性約束 Value-based constraints 值約束 Tuple-based constraints 元組約束 ...
資料庫複習⑧
2016年6月18日
21:23
Main Integrity Constraints 實體完整性約束
1.各種約束
Keys
Foreign-key 外鍵 引用完整性約束
Value-based constraints 值約束
Tuple-based constraints 元組約束
Assertions 斷言
2.Key Constrains
Primary Key:
CREATE TABLE branch(
bname CHAR(15) PRIMARY KEY,
bcity CHAR(20),
assets INT);
or
CREATE TABLE depositor(
cname CHAR(15),
acct_no CHAR(5),
PRIMARY KEY(cname, acct_no));
Candidate Keys:
CREATE TABLE customer (
ssn CHAR(9) PRIMARY KEY,
cname CHAR(15),
address CHAR(30),
city CHAR(10),
UNIQUE (cname, address, city);
3.Attribute Constraints
4.Foreign Keys外鍵
主鍵、外鍵和索引的區別?
主鍵 |
外鍵 |
索引 |
|
定義: |
唯一標識一條記錄,不能有重覆的,不允許為空 |
表的外鍵是另一表的主鍵, 外鍵可以有重覆的, 可以是空值 |
該欄位沒有重覆值,但可以有一個空值 |
作用: |
用來保證數據完整性 |
用來和其他表建立聯繫用的 |
是提高查詢排序的速度 |
個數: |
主鍵只能有一個 |
一個表可以有多個外鍵 |
一個表可以有多個惟一索引 |
1、外鍵引用的是需要其它表的主鍵,或者候選鍵。
2、外鍵創建之後並不會自動創建索引,這個是有開發人員自己考慮在外鍵上建相關索引是否能獲取到查詢效率上的提升
3、預設的情況下如果在引用表插入不存在的外鍵值或者在主表刪除了一個被引用的數據,資料庫都會報錯。
5.Global Constraint: Assertions 全局限制 斷言
CREATE ASSERTION <name>
CHECK ( <condition> );
6.Trigger 觸發器
語法:
DELIMITER |
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo代表該表的所有者
FOR EACH ROW
BEGIN
--do something
END |
觸發器(trigger)是SQL server 提供給程式員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程式調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。
DML觸發器
當資料庫中表中的數據發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那麼該觸發器自動執行。DML觸發器的主要作用在於強制執行業 務規則,以及擴展Sql Server約束,預設值等。因為我們知道約束只能約束同一個表中的數據,而觸發器中則可以執行任意Sql命令。
DDL觸發器
它是Sql Server2005新增的觸發器,主要用於審核與規範對資料庫中表,觸發器,視圖等結構上的操作。比如在修改表,修改列,新增表,新增列等。它在資料庫結構發生變化時執行,我們主要用它來記錄資料庫的修改過程,以及限製程序員對資料庫的修改,比如不允許刪除某些指定表等。
舉例:
插入時:
create trigger tri_insert
on student
for insert
as
declare @student_idchar(10)
select @student_id=s.student_id from students
inner join insertedion s.student_id=i.student_id
if @student_id='0000000001'
begin
raiserror('不能插入1的學號!',16,8)
rollbacktran
end
go
更新時:
create trigger tri_update
on student
for update
as
if update(student_id)
begin
raiserror('學號不能修改!',16,8)
rollbacktran
end
go
刪除時:
create trigger tri_delete
on student
for delete
as
declare @student_idvarchar(10)
select @student_id=student_id from deleted
if @student_id='admin'
begin
raiserror('錯誤',16,8)
rollbacktran
End
資料庫複習⑨:摘要: Transact-SQL、流程式控制制命令、資料庫命令、常用函數、游標編程、存儲過程