2012-01-12 43 views
31

Có thể nào trong SQL Server 2008 có bảng được tạo bằng 2 cột cùng lúc với khóa chính và khóa ngoài không? Nếu có, mã như thế sẽ như thế nào? Tôi đã tìm kiếm và không có gì.Khoá chính và khóa ngoài cùng lúc

+0

Ý bạn là SQL sẽ tạo bảng trông như thế nào? –

+3

Đây là một trường hợp rất phổ biến trên các khung công tác ORM cho phép ánh xạ thừa kế bằng cách thực hiện ánh xạ bảng cho mỗi lớp. Ví dụ, nếu một lớp B kế thừa từ một lớp A, và lớp được ánh xạ tới table_a và table_b, thì các cá thể của B có cùng một id trên table_a và table_b, và table_b định nghĩa một FK trên cột id của nó là table_a cột id. Chỉ cần cố gắng xác định FK và PK bằng cách sử dụng SQLServer Management Studio. –

Trả lời

47

Chắc chắn, không có vấn đề:

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

này là khá thường được sử dụng để mô hình nhiều-nhiều mối quan hệ.

+0

Giống như một FYI, trong 'information_schema.key_column_usage' cho bảng' UserToGroup', cả 'UserID' và' GroupID 'sẽ trả về hai hàng mỗi ... một cho PK, một cho FK ... [tham chiếu đến ...] (http://stackoverflow.com/a/15622288/623952) –

7

Đây là các cấu trúc hoàn toàn khác nhau.

A Khoá chính được sử dụng để thực thi tính duy nhất trong bảng và là số nhận dạng duy nhất cho một bản ghi nhất định.

A Khóa ngoài được sử dụng để tính toàn vẹn tham chiếu, để đảm bảo rằng giá trị tồn tại trong bảng khác.

Khóa ngoại cần tham chiếu khóa chính trong bảng khác.

Nếu bạn muốn có khóa ngoại cũng độc nhất, bạn có thể tạo ràng buộc FK và thêm chỉ mục/ràng buộc duy nhất vào trường đó.

Đối với mục đích tham chiếu, SQL Server cho phép FK tham chiếu đến UNIQUE CONSTRAINT cũng như trường PRIMARY KEY.

1

Chỉ cần một cách nhanh chóng lưu ý - từ trang Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx) ...

"Một ràng buộc khoá ngoại không phải chỉ được liên kết với một ràng buộc khoá chính trong bảng khác, nó cũng có thể được định nghĩa để tham khảo các cột của một ràng buộc UNIQUE trong một bảng khác. "

Không được sử dụng thường xuyên, nhưng hữu ích trong một số trường hợp.

3

Có lẽ đó không phải là ý tưởng hay vì bạn thường muốn cho phép các khóa ngoại trùng lặp lại trong bảng. Ngay cả khi bạn không phải bây giờ, trong tương lai, bạn có thể, tốt nhất là không nên làm điều này. Xem Is it fine to have foreign key as primary key?

+1

Tại sao không? Giống như liên kết bạn đã đặt, nó cho biết có những trường hợp như mối quan hệ 1 đến 1 trong đó có thể là cần thiết –

+0

Tôi không nói đó LUÔN là một ý tưởng tồi;) Bạn nói đúng, có thể có trường hợp ngoại lệ luôn là 1: 1. Ý kiến ​​của tôi là ở đây để làm cho mọi người suy nghĩ về sự lựa chọn đúng đắn cho họ. – thebiggestlebowski

Các vấn đề liên quan