2012-01-12 69 views
31

在SQL Server 2008中是否可以創建一個使用兩列同時是主鍵和外鍵的表?如果是,那麼這樣的代碼將如何?我搜索了一無所獲。主鍵和外鍵同時出現

+0

您的意思是創建表的SQL是什麼樣子的? – 2012-01-12 21:53:24

+3

這是ORM框架上的一個非常常見的情況,它通過執行按類表映射來支持繼承映射。例如,如果一個類B繼承自一個類A,並且這些類被映射到table_a和table_b,那麼通常B的實例在table_a和table_b上具有相同的id,並且table_b在它的id列上爲table_a定義了一個FK ID列。試着使用SQLServer Management Studio來定義FK和PK。 – 2015-06-29 18:26:17

回答

47

當然,沒問題:

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 
); 

這是很常用的許多一對多的關係進行建模。

+0

就像FYI一樣,在UserToGroup表的'information_schema.key_column_usage'中,'UserID'和'GroupID'都會返回兩行,一個用於PK,一個用於FK ... [參考...](http://stackoverflow.com/a/15622288/623952) – 2013-03-25 18:53:21

7

這些是完全不同的構造。

A 主鍵用於強制執行表內的唯一性,並且是某個記錄的唯一標識符。

A 外鍵用於引用完整性,以確保值存在於另一個表中。

外鍵需要引用另一個表中的主鍵。

如果你想擁有一個也是唯一的外鍵,你可以創建一個FK約束,併爲該字段添加一個唯一索引/約束。

爲便於參考,SQL Server允許FK引用UNIQUE CONSTRAINT以及PRIMARY KEY字段。

3

這可能不是一個好主意,因爲你經常想在表中允許重複的外鍵。即使你現在沒有,將來也可能,最好不要這樣做。請參閱Is it fine to have foreign key as primary key?

+1

爲什麼不呢?就像你所說的鏈接一樣,它說有一些情況像是一對一的關係,在這可能是必要的 – 2015-12-16 01:57:39

+0

我沒有說這總是一個壞主意;)你是對的,可能會有例外,它會永遠是1:1。我的評論在這裏讓人們爲他們思考正確的選擇。 – thebiggestlebowski 2016-08-17 23:22:00