我在一個地方看到 REFERENTIAL的說明:
(通常使用外鍵) 基於其他表中的列的值,指定可接受的用於更新的數據值? 請問具體如何使用,能否舉個例子說明?
約束:
以外鍵約束爲例說明一下:
1、創建測試環境:
if exists (select 1
from sysobjects
where id = object_id('dbo.tab1')
and type = 'U')
drop table dbo.tab1
go
/*==============================================================*/
/* Table: tab1 */
/*==============================================================*/
create table dbo.tab1 (
personid char(2) not null,
personname varchar(10) null,
depid char(4) null,
constraint PK_TAB1 primary key (personid)
)
go
alter table dbo.tab1
add constraint FK_TAB1_REFERENCE_TAB2 foreign key (depid)
references dbo.tab2 (depid)
go
alter table dbo.tab1
drop constraint FK_TAB1_REFERENCE_TAB2
go
if exists (select 1
from sysobjects
where id = object_id('dbo.tab2')
and type = 'U')
drop table dbo.tab2
go
/*==============================================================*/
/* Table: tab2 */
/*==============================================================*/
create table dbo.tab2 (
depid char(4) not null,
depname varchar(10) null,
constraint PK_TAB2 primary key (depid)
)
go
alter table dbo.tab1
add constraint FK_TAB1_REFERENCE_TAB2 foreign key (depid)
references dbo.tab2 (depid)
go
2、插入測試數據:
insert tab2
select '0001','綜合辦公室' union all
select '0002','採購部'
insert tab1
select '01','張三','0001' union all
select '02','李四','0002' union all
select '03','王五','0001' union all
select '04','薛六','0002'
3、以添加數據、刪除數據、刪除表三個例子說明一下約束的作用:
(1)、添加數據時,如果在部門表裏面沒有的部門編號,在人員信息表不允許錄入,測試如下:
insert tab1
select '05','張三','0003'
錯誤提示:
消息 547,級別 16,狀態 0,第 1 行
INSERT 語句與 FOREIGN KEY 約束"FK_TAB1_REFERENCE_TAB2"衝突。該衝突發生於數據庫"DB_ACSERP",表"dbo.tab2", column 'depid'。
語句已終止。
(2)在刪除部門表中的數據時,如果要刪除的數據存在於人員信息表中,不允許刪除:
delete from tab2 where depid='0001'
錯誤提示:
消息 547,級別 16,狀態 0,第 1 行
DELETE 語句與 REFERENCE 約束"FK_TAB1_REFERENCE_TAB2"衝突。該衝突發生於數據庫"DB_ACSERP",表"dbo.tab1", column 'depid'。
語句已終止。
(3)刪除表:
drop table tab2
錯誤提示:
消息 3726,級別 16,狀態 1,第 1 行
無法刪除對象 'tab2',因爲該對象正由一個 FOREIGN KEY 約束引用。
4、刪除測試環境:
drop table tab1
drop table tab2
完成。
通過以上內容,你應該可以理解了外鍵約束的使用方法了。
我想樓主應該問的是級聯更新與級聯刪除的意思吧。要實現級聯更新與級聯刪除就是使用on update 與on delate選項。
方法:
constraint fk_a foreign key (a) refrences table1.a on 【delete/update】 cascade
FOREIGN KEY 約束用於引用其它表。FOREIGN KEY 可以是單列鍵或多列鍵。下例顯示 employee 表上引用 jobs 表的單列 FOREIGN KEY 約束。對於單列 FOREIGN KEY 約束,只需要 REFERENCES 子句。
job_id smallint NOT NULL
DEFAULT 1
REFERENCES jobs(job_id)
也可以顯式使用 FOREIGN KEY 子句並複述列特性。注意在這兩個表中列名不必相同。
FOREIGN KEY (job_id) REFERENCES jobs(job_id)
多列鍵約束作爲表約束創建。在 pubs 數據庫中,sales 表包含多列 PRIMARY KEY。下例顯示如何從其它表中引用此鍵(可選擇顯式約束名)。
CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)
REFERENCES sales (stor_id, ord_num, title_id)
加上是否級聯更新:
[ ON DELETE { CASCADE ¦ NO ACTION } ]
[ ON UPDATE { CASCADE ¦ NO ACTION } ]
可以在相互間具有引用關係的表上組合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION,將終止執行語句並回滾相關的 CASCADE 操作。當 DELETE 語句導致 CASCADE 和 NO ACTION 組合操作時,在 SQL Server 檢查 NO ACTION 操作之前將執行所有 CASCADE 操作。
-----------------------
- SQL code
- create table T(ID int unique) create table T2(t_id int references t(ID) on delete cascade on update cascade) insert T select 1 insert T2 select 1 insert T2 select 1 ------- update T set ID=2 select * from T2 --- delete T select * from T2