主键和外键同时使用

时间:2012-01-12 21:51:14

标签: sql-server foreign-keys primary-key

在SQL Server 2008中是否可以使用2列同时创建主键和外键的表?如果是的话,这样的代码怎么样?我搜索过,什么都没有。

4 个答案:

答案 0 :(得分:54)

当然,没问题:

CREATE TABLE dbo.[User]
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [Group] 
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [UserToGroup]
(
  UserId int NOT NULL,
  GroupId int NOT NULL,
  PRIMARY KEY CLUSTERED ( UserId, GroupId ),
  FOREIGN KEY ( UserId ) REFERENCES [User] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE,
  FOREIGN KEY ( GroupId ) REFERENCES [Group] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE
);

这常用于模拟多对多关系。

答案 1 :(得分:8)

这些是完全不同的结构。

主键用于强制表中的唯一性,并且是特定记录的唯一标识符。

外键用于参照完整性,以确保另一个表中存在值。

外键需要引用另一个表中的主键。

如果你想拥有一个也是唯一的外键,你可以制作一个FK约束,并为同一个字段添加一个唯一的索引/约束。

出于参考目的,SQL Server允许FK引用UNIQUE CONSTRAINT以及PRIMARY KEY字段。

答案 2 :(得分:3)

这可能不是一个好主意,因为通常你想在表中允许重复的外键。即使你现在不在,将来也可能,最好不要这样做。见Is it fine to have foreign key as primary key?

答案 3 :(得分:1)

快速说明 - 来自Microsoft页面(http://msdn.microsoft.com/en-us/library/ms189049.aspx)...

“外键约束不必仅链接到另一个表中的主键约束;它也可以定义为引用另一个表中UNIQUE约束的列。”

经常使用,但在某些情况下很有用。