T-SQL基础之外键约束

首先创建测试表

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);

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"fk_id11"冲突。该冲突发生于数据库"test",表"dbo.test01", column ‘id1‘。
语句已终止。

如果在创建外键之前就已经在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);

消息 547,级别 16,状态 0,第 1 行
ALTER TABLE 语句与 FOREIGN KEY 约束"fk_id11"冲突。该冲突发生于数据库"test",表"dbo.test01", column ‘id1‘。

此时可以通过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;

消息 547,级别 16,状态 0,第 1 行
UPDATE 语句与 REFERENCE 约束"fk_id11"冲突。该冲突发生于数据库"test",表"dbo.test02", column ‘id11‘。
语句已终止。

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

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则是相应数据修改为默认值。

时间: 2024-10-05 19:41:28

T-SQL基础之外键约束的相关文章

MySQL之外键约束

MySQL之外键约束 MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY    [index_name] (index_col_name, ...)    REFERENCES tbl_name (index_col_name,...)    [ON DELETE reference_option]    [ON UPDATE refere

8、SQL基础整理(约束)

约束 主键约束 防止在新增数据时出错,有约束性,起唯一标志的作用,在新增条目的时候防止不慎添加重复内容(不允许有null值) 1.  右键—设计—设置主键 2.在创建表格时设置 code int primary key, 3.可以设置自增长的功能 code int primary key identity(1,1) 4.在自增长的环境下删掉其中一行,其他行不受影响 5.可以加快查询的速度,减慢新增和修改的速度 外键约束 设计—关系—添加—表和列规范—需要有联系的两个列 主键需要先设置,然后在主键

MySQL学习笔记(9)之外键约束

外键约束 外键:用于建立两个实体间的联系. 外键约束:限制当前表的记录与关联表的记录之间的对应关系. 约束限制:如果主表不存在某信息,则从表不能插入.

mysql SQL设置外键约束ON DELETE CASCADE

第一步:删除原有的外键约束 ALTER TABLE child_table DROP FOREIGN KEY `FK_Reference_2` ; 第二步:添加新的外键约束,增加ON DELETE CASCADE ALTER TABLE child_table ADD CONSTRAINT `FK_Reference_2` FOREIGN KEY (`parent_id` ) REFERENCES parent_table (`parent_id` ) ON DELETE CASCADE ON

Sql Server外键约束

一.添加约束(级联删除) 1.创建表结构时添加 create table UserDetails(id int identity(1,1) primary key,name varchar(50) not null, --真实姓名userId int,foreign key (userId) references UserInfo(UserId) on delete cascade) 2.表结构已存在时添加 ALTER TABLE [dbo].[API_User_Label]  WITH CHE

(转载)SQL基础--> 约束(CONSTRAINT)

感谢Leshami的分享,原文地址:http://blog.csdn.net/leshami/article/details/5711367 --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完整性 实体完整性:表中记录不重复(任何两条记录不全等)并且每条记录都有一个非空主键 域完整性:表中字段值必须与字段数据类型.格式.有效范围相吻合 参照完整性:不能引

SQL基础--> 约束(CONSTRAINT)

--============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完整性 实体完整性:表中记录不反复(不论什么两条记录不全等)而且每条记录都有一个非空主键 域完整性:表中字段值必须与字段数据类型.格式.有效范围相吻合 參照完整性:不能引用不存在的值 自己定义完整性:依据特定业务领域定义的需求完整性 保证数据完整性的几种经常用法 约束(最经常使用) 过程 函数 触发器 实体

sql完美删除外键约束,避免产生问题

解决无法删除表,提示被外键约束引用 有时想删除某个表时,提示“无法删除对象 'Orders',因为该对象正由一个 FOREIGN KEY 约束引用”,原因很简单不要急躁,它被其它表的外键引用了,所以无法删除,在此只需先找到哪些表的外键引用了该表的字段.通过系统函数就能解决(SQL Server系统函数提供了非常完善的功能,能代替我们查找和解决许多问题). select     fk.name,fk.object_id,OBJECT_NAME(fk.parent_object_id) as ref

SQL基础--> 约束(CONSTRAINT)

一.几类数据完整性 实体完整性:表中记录不重复(任何两条记录不全等)并且每条记录都有一个非空主键 域完整性:表中字段值必须与字段数据类型.格式.有效范围相吻合 参照完整性:不能引用不存在的值 自定义完整性:根据特定业务领域定义的需求完整性 保证数据完整性的几种常用方法 约束(最常用) 过程 函数 触发器 实体完整性:primary key.unique.索引(index) 域完整性:check.foreign key.not null.数据类型 参照完整性:foreign key 自定义完整性: