搜尋此網誌

2011年3月3日 星期四

SQL_指令_設定外部鍵

1.      外部鍵是一種限制,拿來表示要參照某表格中的某列,外部鍵所參照的欄位稱為父鍵,其表格稱為父表格,而外部鍵所屬的表格稱為子表格
2.      父鍵的值必須為PRIMARY KEY UNIQUE
3.      外部鍵可設定連鎖更新、連鎖刪除,當父鍵的欄值有更動,或欄遭刪除,其對照的外部鍵也會一同變更
4.      注意:不可在刪除父表格前就刪除子表格



方法一※製作表格時設定

1. 定義完所有欄位後可以這樣寫 

create table 子Table名 (欄位名A 資料類型A, 欄位名B 資料類型B, foreign key (外部鍵欄位名) references 父Table名 ( 父鍵欄位名 ))


EX:


create table test1 (id int, neme2 varchar (20),foreign key (id) references stest (no))

 


2. 定義欄位時可以這樣寫 
create table 子Table名 (欄位名A 資料類型A references 父Table名 ( 父鍵欄位名 ), 欄位名B 資料類型B,)

EX:


create table test2 (id2 int references stest (no), neme3 varchar (20))

檢視成果:

指令

insert into test1 values (5,'bb') ;
insert into test1 values (1,'aa') ;

insert into test2 values (5,'bb') ;
insert into test2 values (1,'aa') ;

SQL訊息
(1 個資料列受到影響)
訊息547,層級16,狀態0,行2
INSERT 陳述式與FOREIGN KEY 條件約束"FK__test1__id__1FCDBCEB" 衝突。衝突發生在資料庫"test1",資料表"dbo.stest", column 'no'
陳述式已經結束

(1 個資料列受到影響)
訊息547,層級16,狀態0,行4
INSERT 陳述式與FOREIGN KEY 條件約束"FK__test2__id2__21B6055D" 衝突。衝突發生在資料庫"test1",資料表"dbo.stest", column 'no'
陳述式已經結束
 
資料(1,'aa')登入失敗 因父鍵 "no"欄位無對照資料"1"所以登入失敗

table結果:
stest
no
name
外文
4
山內
a
5
山中
a
test1
id
neme2
5
bb
tset2
id2
neme3
5
bb


 





方法二※表格建立後才追加建立外部鍵 ※

alter table 子Table名 addforeign key (外部鍵欄位名) references 父Table名 ( 父鍵欄位名 )

EX: alter table test2 add foreign key (no2) references stest
(no)


 

沒有留言:

張貼留言