代码改变世界

数据库的外键支不支持空值?

2007-02-05 09:22  爱车龟速兔  阅读(2913)  评论(1编辑  收藏  举报

FOREIGN KEY 约束允许空值

测试sql语句如下:

现建立了一个临时数据库tempdb

 

1: 先执行下列语句创建两个表:

 

create table zhuhu

(

oid INT IDENTITY(1,1) PRIMARY KEY   NOT NULL,

zhuhuname char(20), )

 

 

create table yezhu

(

oid INT IDENTITY(1,1) PRIMARY KEY   NOT NULL,

yezhuhao char(20),

zhuhuhao int foreign key references  zhuhu, )

 

2: 然后向两个表中各插入一行数据

insert into zhuhu

( zhuhuname) values( 'duoduo')   // 添进去后, oid1.

 

insert into yezhu

(yezhuhao, zhuhuhao) values('haodongxi',1)

 

3: 然后进行删除测试:

delete from zhuhu

where oid = 1

 

报告删除出错, 出错信息如下:

服务器: 消息 547,级别 16,状态 1,行 1

DELETE 语句与 COLUMN REFERENCE 约束 'FK__yezhu__zhuhuhao__681373AD' 冲突。该冲突发生于数据库 'tempdb',表 'yezhu', column 'zhuhuhao'

语句已终止。

 

错误分析: 外键关联不允许级联删除, 如果在住户表中删除了oid1的行, 那么就违反了业主表中的参照这一行的外键约束. 所以删除失败.

 

 

为了达到只删除被参照表的目的, 我们有进行了下面的测试,

4: 在进行yezhu表中插入一个外键值为null的行:

insert into yezhu

(yezhuhao, zhuhuhao) values('haodongxi',null)

执行成功, (因为这个表的外键字段允许为null)

 

5: 执行下列更新语句:

update yezhu

set zhuhuhao  = null

where zhuhuhao  =1

将参考了待删除的行的外键参考置为null

 

6: 删除:

delete from zhuhu

where oid = 1

 

成功:

 

其实这个检查是有问题的,

数据库对存在外键参考的值的删除有三种处理方式, 1: 级联删除, 2:置空值 3: 不允许删除.

 sql server默认的外键参考关系有一个叫做强制外键约束的属性, 这个属性的默认值为true, 当强制外键约束的值为true, 是不允许空值的, 如果把这个值改为false, 那么就可以删除了, 删除后, sqlserver会自动把参考这个记录的所有字段都置为null.