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') // 添进去后, oid为1.
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'。
语句已终止。
错误分析: 外键关联不允许级联删除, 如果在住户表中删除了oid为1的行, 那么就违反了业主表中的参照这一行的外键约束. 所以删除失败.
为了达到只删除被参照表的目的, 我们有进行了下面的测试,
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.