数据库表外键设置

http://blog.csdn.net/pplsunny/article/details/7747340

我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

常见的数据库主键选取方式有:

  • 自动增长字段
  • 手动增长字段
  • UniqueIdentifier
  • “COMB(Combine)”类型

 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

 

详细例子:

     创建来年各个简单的表:Author表和Detail表

Sql语句如下:

create table Author
(
idint identity(1,1) primary key not null,
namevarchar(50)
)

create table Detail
(
idint identity(1,1) primary key not null,
author_id      int,

        detail            varchar(50)
)

 

--添加外键约束语法注释:alter table 表名 add constraint 约束名 foreign key (引用外键列名) references 外键表(外键列)

可视化的操作方法:

  table->选中表->design->选中需要设置外键的字段->选择“关系”->选择"添加"->在表和列规范处选择右边省略号(见图一)->再选择相应关系(见图二)。

如图:

图一:

 


 

 

图二:

 

 


 

备注:

1.。。外键和主键的字段的数据类型必须相同。

2.。。在删除表的时候要先删除外键表才能删除主键表

3.。。图二中主键表选择要设置外键字段参照的表(即主键表的一个主键是将要设计的外键),外键表就是要添加外键的表。

 

下面提供一个网上搜集的综合实例.

 

--创建数据库
USE master
GO
IF EXISTS(SELECT * FROM sysdatabases WHERE NAME='study')
DROP DATABASE study
GO

CREATE DATABASE study
ON
( NAME = study_dat,
   FILENAME = 'c:/study/study_data.mdf',
   SIZE = 5MB,
   MAXSIZE = 25MB,
   FILEGROWTH = 5MB )
LOG ON
( NAME = 'study_log',
   FILENAME = 'c:/study/study_log.ldf',
   SIZE = 5MB,
   MAXSIZE = 25MB,
   FILEGROWTH = 5MB )
GO

--打开库
use study

--创建表

IF EXISTS(SELECT * FROM sysobjects WHERE NAME='Stu_PkFk_S')
DROP TABLE Stu_PkFk_S
GO
create table Stu_PkFk_S
(
sno char(6),
sname char(10),
age int,
sex char(2),
constraint PK_S primary key (sno),   --主键
constraint CK_age check(age>=0 and age<=150)  --约束
)

create table Stu_PkFk_C
(
cno char(8),
cname char(16),
credit int,
constraint PK_C primary key (cno), --主键
constraint CK_credit check (credit>=0)  --约束
)

create table Stu_PkFk_SC
(
sno char(6),
cno char (8),
constraint PK_SC primary key (sno,cno),
constraint FK_s foreign key (sno) references Stu_PkFk_S(sno), --外键
constraint FK_c foreign key (cno) references Stu_PkFk_C(cno)
)

--测试数据
insert into Stu_PkFk_S values ('001','zhang',19,'男')

insert into Stu_PkFk_S values('002','li',16,'女')

insert into Stu_PkFk_C values('001','li',100)

insert into Stu_PkFk_SC values('002','001')

select * from Stu_PkFk_S
select * from Stu_PkFk_C
select * from Stu_PkFk_SC

DELETE FROM Stu_PkFk_S
DELETE FROM Stu_PkFk_SC

 
--测试添加删除外键
--添加外键约束语法注释:alter table 表名 add constraint 约束名 foreign key (引用外键列名) references 外键表(外键列)

--删除外键
alter table Stu_PkFk_Sc drop constraint  FK_s
alter table Stu_PkFk_SC drop constraint  FK_c

--添加外键
alter table Stu_PkFk_Sc
        add constraint Fk_s
        foreign key (sno)
        references Stu_PkFk_S(sno)
go

alter table Stu_PkFk_SC
        add constraint Fk_c
        foreign key (cno)
        references Stu_PkFk_C(cno)
go

 

--测试添加删除主键

 --删除主键
alter table Stu_PkFk_S drop constraint PK_S  
go  

--增加主键
alter table Stu_PkFk_S add constraint  PK_S primary key (sno)  
go

posted @ 2012-11-07 11:15  水——云——间  阅读(3880)  评论(0编辑  收藏  举报