子表,父表的定义: 拥有外键的表是子表。主键被<a target="_self"><span style="text-decoration: underline;">[b]其它[/b]</span></a>表引用的表是父表。<br>换句话说:因为父表的标识被很多个子表中的记录引用,所以叫父表。<br>拥有外键关系,并且可以随便删除数据,不影响其它表的数据的那个表叫子表。<br><br>使用的时候谁做为谁的外键,主要从以下两点考虑:<br>          1/,删除是如何相互影响的,删除记录受约束的那个是父表,不受约束的那个是子表;<br>          2/,记录必须先存在的是父表;
<span>关于外键、关系以</span><br><br>[b]两种用途:<br>[/b]1/, 最常用的一种: 减少重复数据.表a中拥有外键,表b的数据基本是不允许删除的.这时选择[b]对 insert 和 update 强制关系[/b]即可.[b]<br>[/b]2/,其次,是增加一个从属表. 如果表a删除一条记录时,表b中也随着删除一条相关联的记录,那么外键关系中,表a的主键是表b的外键。这种关系,实际上表b是表a的从属表(即表a是父表),选择[b]对 insert 和 update 强制关系[/b]时,如果向表b中插入数据,表a中必须已经存在对应的记录。选择[b]级联删除相关的字段[/b]时,删除表a中的一条记录,就会删除对应的表b中的一条记录。<br><br><br>参考资料:<br><br>[b]1,sql2000 中 ,设计表>管理关系中 关于外键的5个选项都起什么作用?<br><br>创建中检查现存数据[/b]<br><br>创建关系时将关系应用于外键表中的现有数据。如果选定该对话框,一个错误信息将会通知您有违反约束的数据。<br><br>[b]对 insert 和 update 强制关系[/b]<br><br>如果选择该选项,则只要使用这些语句在外键表中添加或更新数据时都将强制约束。<br><br>[b]对复制强制关系[/b]<br><br>如果选择该选项,则无论何时将外键表复制到一个不同的<a target="_self"><span style="text-decoration: underline;">[b]数据库[/b]</span></a>,都将强制关系的引用完整性。<br>[b]级联更新相关的字段[/b]<br><br>无论何时更新主键值,都指示数据库将新的键值传播到相应的外键字段。<br><br>[b]级联删除相关的字段[/b]<br><br>无论何时删除主表中的行,都指示数据库从外键表中删除相应的行。<br><br>[b]2,cascade 有 什么作用?<br><br>[/b]on   delete   {cascade   |   no   action}<br>  <br>指定当表中被更改的行具有引用关系,并且该行所引用的行从父表中删除时,要对被更改行采取的操作。默认设置为   no   action。   <br>  <br>如果指定   cascade,则从父表中删除被引用行时,也将从引用表中删除引用行。如果指定   no   action,sql   server   将产生一个错误并回滚父表中的行删除操作。<br>  <br>如果表中已存在   on   delete   的   instead   of   触发器,那么就不能定义   on   delete   的cascade   操作。<br>  <br>例如,在   northwind   数据库中,orders   表和   customers   表之间有引用关系。orders.customerid   外键引用   customers.customerid   主键。<br>  <br>如果对   customers   表的某行执行   delete   语句,并且为   orders.customerid   指定   on   delete   cascade   操作,则   sql   server   将在   orders   表中检查是否有与被删除的行相关的一行或多行。如果存在相关行,那么   orders   表中的相关行将随   customers   表中的被引用行一同删除。<br>  <br>反之,如果指定   no   action,若在   orders   表中至少有一行引用   customers   表中要删除的行,则   sql   server   将产生一个错误并回滚   customers   表中的删除操作。<br>  <br>on   update   {cascade   |   no   action}<br>  <br>指定当表中被更改的行具有引用关系,并且该行所引用的行在父表中更新时,要对被更改行采取的操作。默认设置为   no   action。   <br>  <br>如果指定   cascade,则在父表中更新被引用行时,也将在引用表中更新引用行。如果指定   no   action,sql   server   将产生一个错误并回滚父表中的行更新操作。<br>  <br>如果表中已存在   on   delete   的   instead   of   触发器,那么就不能定义   on   delete   的cascade   操作。<br>  <br>例如,在   northwind   数据库中,orders   表和   customers   表之间有引用关系。orders.customerid   外键引用   customers.customerid   主键。<br>  <br>如果对   customers   表的某行执行   update   语句,并且为   orders.customerid   指定   on   update   cascade   操作,则   sql   server   将在   orders   表中检查是否有与被更新行相关的一行或多行。如果存在相关行,那么   orders   表中的相关行将随   customers   表中的被引用行一同更新。<br>  <br>反之,如果指定了   no   action,若在   orders   表中至少存在一行引用   customers   表中要更新的行,那么   sql   server   将引发一个错误并回滚   customers   表中的更新操作。<br>[b]3,一个sql创建外键的例子:[/b]<br><br>/*建库,名为student_info*/<br>create database student_info<br>/*使用

student_info*/<br>use student_info<br>go<br>/*建student表,其中s_id为主键*/<br><span style="color: #008000;">create table student<br>(<br>s_id int identity(1,1) primary key,<br>s_name varchar(20) not null,<br>s_age int<br>)<br></span>go<br>/*建<a target="_self"><span style="text-decoration: underline;">[b]test[/b]</span></a>表,其中test_no为主键*/<br><span style="color: #008000;">create table test<br>(<br>test_no int identity(1,1) primary key,<br>test_name varchar(30),<br>nax_marks int not null default(0),<br>min_marks int not null default(0)<br>)<br></span>go<br>/*建marks表,其中s_id和test_no为外建,分别映射student表中的s_id和test表中的test_no*/<br><span style="color: #008000;">create table marks<br>(<br>s_id int not null,<br>test_no int not null,<br>marks int not null default(0),<br>primary key(s_id,test_no),<br>foreign key(s_id) references student(s_id),<br>foreign key(test_no) references test(test_no)<br>)<br></span><span style="color: #000000;">go</span>