文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>SQL主外键区分

SQL主外键区分

时间:2011-04-09  来源:勤奋的菜鸟

子表,父表的定义:拥有外键的表是子表。主键被其它表引用的表是父表。
换句话说:因为父表的标识被很多个子表中的记录引用,所以叫父表。
拥有外键关系,并且可以随便删除数据,不影响其它表的数据的那个表叫子表。

使用的时候谁做为谁的外键,主要从以下两点考虑:
          1/,删除是如何相互影响的,删除记录受约束的那个是父表,不受约束的那个是子表;
          2/,记录必须先存在的是父表;

两种用途:
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

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载