码迷,mamicode.com
首页 > 数据库 > 详细

T-SQL基础之外键约束

时间:2016-10-24 20:02:55      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:修改   允许   也有   val   tar   int   技术分享   输入   约束   

首先创建测试表

use test;
create table test01
(
id1 int not null,
id2 int not null
);
create table test02
(
id11 int not null,
id22 int not null
);
alter table test01 add constraint pk_id1
  primary key(id1);

考虑如下关系

技术分享

test02表中的id11依赖于test01中的id1,因此为test02创建外键

alter table test02 add constraint fk_id11
  foreign key(id11) references test01(id1);

注意:test01表中的id1必须为主键或者唯一索引,否则无法创建基于id1的外键。

 

创建外键之后,我们将发现无法在test02中输入不在test01的id1范围内的数据

技术分享
insert into test02 values(1,1);
View Code
技术分享
消息 547,级别 16,状态 0,第 1INSERT 语句与 FOREIGN KEY 约束"fk_id11"冲突。该冲突发生于数据库"test",表"dbo.test01", column id1。
语句已终止。
View Code

如果在创建外键之前就已经在test02中有了不在test01的id1范围内的数据,则创建外键会失败

技术分享
alter table test02 drop constraint fk_id11;
insert into test02 values(1,1);
alter table test02 add constraint fk_id11
  foreign key(id11) references test01(id1);
View Code
技术分享
消息 547,级别 16,状态 0,第 1ALTER TABLE 语句与 FOREIGN KEY 约束"fk_id11"冲突。该冲突发生于数据库"test",表"dbo.test01", column id1
View Code

此时可以通过with nocheck选项,强制跳过现有数据检查

alter table test02 with nocheck
  add constraint fk_id11
  foreign key(id11) references test01(id1);

虽然在test01表中id1设置为了主键,不允许null,但是在test02表中的id2可以允许null值

alter table test02 alter column id11 int null;
insert into test02 values(null,1);

 

当我们从test01进行删除或修改数据操作的时候,如果在test02表中也有相关数据则会报错,拒绝操作;

技术分享
insert into test01 values(2,1);
insert into test02 values(2,1);
update test01 set id1=3 where id1=2;
View Code
技术分享
消息 547,级别 16,状态 0,第 1UPDATE 语句与 REFERENCE 约束"fk_id11"冲突。该冲突发生于数据库"test",表"dbo.test02", column id11。
语句已终止。
View Code

此时我们可以通过级联操作来同步删除或修改两个表中的数据。

alter table test02 drop constraint fk_id11;
alter table test02 with nocheck
    add constraint fk_id11
    foreign key(id11) references test01(id1)
    on update cascade;
update test01 set id1=3 where id1=2;

这样test02表中的数据也会相应修改

 

级联操作包括cascade/set null/set default,跟在操作on delete/on update之后

其中cascade是做相同修改;set null是test02表中相应数据修改为null;set default则是相应数据修改为默认值。

 

T-SQL基础之外键约束

标签:修改   允许   也有   val   tar   int   技术分享   输入   约束   

原文地址:http://www.cnblogs.com/mowl/p/5994002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!