数据库表外键设置
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