子表,父表的定义: 拥有外键的表是子表。主键被其它表引用的表是父表。
换句话说:因为父表的标识被很多个子表中的记录引用,所以叫父表。
拥有外键关系,并且可以随便删除数据,不影响其它表的数据的那个表叫子表。
使用的时候谁做为谁的外键,主要从以下两点考虑:
????????? 1/,删除是如何相互影响的,删除记录受约束的那个是父表,不受约束的那个是子表;
????????? 2/,记录必须先存在的是父表;
图3-4外键
关于外键、关系以
两种用途:
1/, 最常用的一种: 减少重复数据.表A中拥有外键,表B的数据基本是不允许删除的.这时选择对 INSERT 和 UPDATE 强制关系即可.
2/,其次,是增加一个从属表. 如果表A删除一条记录时,表B中也随着删除一条相关联的记录,那么外键关系中,表A的主键是表B的外键。这种关系,实际上表B是表A的从属表(即表A是父表),选择对 INSERT 和 UPDATE 强制关系时,如果向表B中插入数据,表A中必须已经存在对应的记录。选择级联删除相关的字段时,删除表A中的一条记录,就会删除对应的表B中的一条记录。
参考资料:
1,SQl2000 中 ,设计表>管理关系中 关于外键的5个选项都起什么作用?
创建中检查现存数据
创建关系时将关系应用于外键表中的现有数据。如果选定该对话框,一个错误信息将会通知您有违反约束的数据。
对 INSERT 和 UPDATE 强制关系
如果选择该选项,则只要使用这些语句在外键表中添加或更新数据时都将强制约束。
对复制强制关系
如果选择该选项,则无论何时将外键表复制到一个不同的数据库,都将强制关系的引用完整性。
级联更新相关的字段
无论何时更新主键值,都指示数据库将新的键值传播到相应的外键字段。
级联删除相关的字段
无论何时删除主表中的行,都指示数据库从外键表中删除相应的行。
2,CASCADE 有 什么作用?
ON?? DELETE?? {CASCADE?? |?? NO?? ACTION}
??
指定当表中被更改的行具有引用关系,并且该行所引用的行从父表中删除时,要对被更改行采取的操作。默认设置为?? NO?? ACTION。???
??
如果指定?? CASCADE,则从父表中删除被引用行时,也将从引用表中删除引用行。如果指定?? NO?? ACTION,SQL?? Server?? 将产生一个错误并回滚父表中的行删除操作。
??
如果表中已存在?? ON?? DELETE?? 的?? INSTEAD?? OF?? 触发器,那么就不能定义?? ON?? DELETE?? 的CASCADE?? 操作。
??
例如,在?? Northwind?? 数据库中,Orders?? 表和?? Customers?? 表之间有引用关系。Orders.CustomerID?? 外键引用?? Customers.CustomerID?? 主键。
??
如果对?? Customers?? 表的某行执行?? DELETE?? 语句,并且为?? Orders.CustomerID?? 指定?? ON?? DELETE?? CASCADE?? 操作,则?? SQL?? Server?? 将在?? Orders?? 表中检查是否有与被删除的行相关的一行或多行。如果存在相关行,那么?? Orders?? 表中的相关行将随?? Customers?? 表中的被引用行一同删除。
??
反之,如果指定?? NO?? ACTION,若在?? Orders?? 表中至少有一行引用?? Customers?? 表中要删除的行,则?? SQL?? Server?? 将产生一个错误并回滚?? Customers?? 表中的删除操作。
??
ON?? UPDATE?? {CASCADE?? |?? NO?? ACTION}
??
指定当表中被更改的行具有引用关系,并且该行所引用的行在父表中更新时,要对被更改行采取的操作。默认设置为?? NO?? ACTION。???
??
如果指定?? CASCADE,则在父表中更新被引用行时,也将在引用表中更新引用行。如果指定?? NO?? ACTION,SQL?? Server?? 将产生一个错误并回滚父表中的行更新操作。
??
如果表中已存在?? ON?? DELETE?? 的?? INSTEAD?? OF?? 触发器,那么就不能定义?? ON?? DELETE?? 的CASCADE?? 操作。
??
例如,在?? Northwind?? 数据库中,Orders?? 表和?? Customers?? 表之间有引用关系。Orders.CustomerID?? 外键引用?? Customers.CustomerID?? 主键。
??
如果对?? Customers?? 表的某行执行?? UPDATE?? 语句,并且为?? Orders.CustomerID?? 指定?? ON?? UPDATE?? CASCADE?? 操作,则?? SQL?? Server?? 将在?? Orders?? 表中检查是否有与被更新行相关的一行或多行。如果存在相关行,那么?? Orders?? 表中的相关行将随?? Customers?? 表中的被引用行一同更新。
??
反之,如果指定了?? NO?? ACTION,若在?? Orders?? 表中至少存在一行引用?? Customers?? 表中要更新的行,那么?? SQL?? Server?? 将引发一个错误并回滚?? Customers?? 表中的更新操作。
3,一个SQL创建外键的例子:
/*建库,名为student_info*/
create database student_info
/*使用student_info*/
use student_info
go
/*建student表,其中s_id为主键*/
create table student
(
s_id int identity(1,1) primary key,
s_name varchar(20) not null,
s_age int
)
go
/*建test表,其中test_no为主键*/
create table test
(
test_no int identity(1,1) primary key,
test_name varchar(30),
nax_marks int not null default(0),
min_marks int not null default(0)
)
go
/*建marks表,其中s_id和test_no为外建,分别映射student表中的s_id和test表中的test_no*/
create table marks
(
s_id int not null,
test_no int not null,
marks int not null default(0),
primary key(s_id,test_no),
foreign key(s_id) references student(s_id),
foreign key(test_no) references test(test_no)
)
go