外鍵能不能為null?


看到書上有這樣一句話:外鍵的值不允許參照相應主表中不存在的主鍵值,或者外鍵為空值.

但我下面的一個練習,卻可以使外鍵為空,對此感到很疑惑

--創建用戶表
create table Users
(
 userID int identity(1,1) primary key,
 username varchar(20) not null,
 password varchar(20),
)

--創建帳套表
create table Account
(
 accountID int identity(1,1) primary key,
 name varchar(20),
 type bit,
 
)

--創建用戶帳套表
create table UserAccount
(
 userID int , 
 accountID  int 
)

--對表useraccount添加外鍵
alter table useraccount
add
constraint FK_useraccount_users foreign key(userID) references Users(userID),
constraint FK_useraccount_account foreign key(accountid) references Account(accountID)

--對users表插入數據
  insert into Users select '王五','123'
  union select '張三','123'
  union select '李四',null

--對Account表插入數據    
  insert into Account 
  select '個人帳',1
  union all
  select '家庭帳',1
  union all 
  select '公司帳',0

--對userAccount表插入數據
insert into userAccount
 select 1,2
union select 1,2
union select 2,3
union select null,null 

--顯示useraccount表數據
select * from useraccount

查詢結果中有記錄顯示插入了null值,我個人認為既然外鍵是引用了主表中主鍵的值,而主表中主鍵的值是不可能為null的,所以從表中的外鍵值也不能為null,否者會破壞數據的完整性規則.
有誰能更清楚的解釋一下這個概念?

24 个解决方案

#1


可以,看看
http://topic.csdn.net/t/20020524/15/749258.html

#2


是不是盜版不一樣,書上明確寫着不能插入null否則報錯

#3


不能為NULL

#4


可以為空

#5


外鍵可以為空的,一個表的關鍵的標識是主鍵,外鍵是否為空不影響表的結構及數據庫設計概念的.外鍵只起個關聯表的作用.
至於書上提到的外鍵不能為空是對的,但實踐中在數據庫里沒有創建關聯時,好像是外鍵,實則不是外鍵.不知LZ是不是沒有創建數據庫關聯

#6


雖然定義了關系
但是屬於未強制關系,這種關系的外鍵約束被禁用。所以樓主定義無實際意義。所以可以插入null數據

#7


可以為空的,我的很多里面都是空!

#8


在指定的關系增加對數據變更的級聯關系就可以了(不能寫入null)
ON UPDATE CASCADE
ON DELETE CASCADE

#9


是可以寫入的。暈,不是級聯關系問題。

#10


直接在SQL SERVER里插入是可以的,但通過DELPHI插入空值就會報錯。我前兩天剛試過

#11


外鍵的值不允許參照相應主表中不存在的主鍵值,或者外鍵為空值.
--------------
不知道樓主怎么理解的這句話,我理解為外鍵可以為空

外鍵的值或者參照相應主表中存在的主鍵值,或者外鍵為空值

#12


不能為NULL

#13


可以為NULL

create table t1(id int primary key ,col char(1))
create table t2(id int foreign key references t1(id),col char(1))
insert into t1 values(1,'a')
insert into t1 values(2,'a')
insert into t1 values(3,'a')
insert into t2 values(null,'d')
insert into t2 values(1,'d')
insert into t2 values(1,'3')
select * from t2
drop table t2,t1

#14


外鍵的值不允許參照相應主表中不存在的主鍵值,或者外鍵為空值.

這句話這么說更容易理解
外鍵的值或者為空值,或者參照相應主表中存在的主鍵值

應該是這樣 外鍵= 對應主鍵 or isnull(外鍵)

#15


SQL SERVER的聯機幫助里有這樣的兩條:
FOREIGN KEY 約束不允許空值,但是,如果任何組合 FOREIGN KEY 約束的列包含空值,則將跳過 FOREIGN KEY 約束的校驗。


當向表的現有列添加 FOREIGN KEY 約束時,默認情況下 Microsoft® SQL Server™ 2000 檢查列中的現有數據,以確保除 NULL 外的所有數據存在於被引用的 PRIMARY KEY 或 UNIQUE 約束的列中。

請問我的例子(userAccount表)是不是因為組合了FOREIGN KEY 約束的列,才造成了可以為空值?不過wgsasd311(自強不息)的例子也可以為空,為什么?
外鍵什么時候能為空什么時候不為空,我徹底迷惑了~~~~~

#16


給UserAccount設置主鍵試試

#17


或者外鍵為空值.
就是說外鍵可以為空值

#18


聯機叢書中准確的解釋是

如果在 FOREIGN KEY 約束的列中輸入非 NULL 值,則此值必須在被引用的列中存在,否則將返回違反外鍵約束的錯誤信息。

也就是說外鍵中可以有null,除非外鍵列定義了not null

#19


外鍵可以為空

#20


呵呵,除了在TIANTIAN 問,也在這里啊

http://blog.sina.com.cn/dotnba

#21


外鍵當然可以為空了
看看你引用的書上的話
"外鍵的值不允許參照相應主表中不存在的主鍵值,或者外鍵為空值."
后面不是說了"或者外鍵為空值",不就是說外鍵可以為空的嗎
外鍵要有值的話必須是主表中存在的主鍵值,可不就是空值

#22


關注

#23


外鍵可以為空值,但如果有值的話一定是你參照的那個主表中的主鍵值.

#24


簡單一句話:

如果插入的記錄 外鍵為非空,則這個外鍵必須是在關聯的表中存在的,如果插入的記錄外鍵為空,則直接插入。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: