2015-05-09 17 views
5

Tôi đã cố giải quyết lỗi này trong vài phút nhưng tôi không biết Tôi bị thiếu từ định nghĩa bảng.Máy chủ SQL: không có khóa chính hoặc khóa ứng viên nào trong bảng được tham chiếu khớp với danh sách cột tham chiếu trong khóa ngoại 'FK'

Mã cho các bảng dưới:

Bảng Autocare:

CREATE TABLE [dbo].[Autocare] 
(
    [IDAutocar] NUMERIC (18, 0) NOT NULL, 
    [IDTipAutocar] NUMERIC (18, 0) NOT NULL, 

    PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC), 

    CONSTRAINT [FK_Autogari_TipAutocar] 
     FOREIGN KEY ([IDTipAutocar]) 
     REFERENCES [dbo].[TipAutocar] ([IDTipAutocar]) 
); 

Bảng Curse:

CREATE TABLE [dbo].[Curse] 
(
    [IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY, 
    [IDTraseu] NUMERIC (18, 0) NOT NULL, 
    [Data] TIMESTAMP NOT NULL, 
    [IDCompanie] NUMERIC (18, 0) NOT NULL, 
    [NrLocuri] NUMERIC (18, 0) NOT NULL, 
    [IDAutocar] NUMERIC (18, 0) NOT NULL, 

    CONSTRAINT [FK_Curse_Trasee] 
     FOREIGN KEY ([IDTraseu]) 
     REFERENCES [Trasee]([IDTraseu]), 
    CONSTRAINT [FK_Curse_Companii] 
     FOREIGN KEY ([IDCompanie]) 
     REFERENCES [Companii]([IDCompanie]), 
    CONSTRAINT [FK_Curse_Autocare] 
     FOREIGN KEY ([IDAutocar]) 
     REFERENCES [Autocare]([IDAutocar]) 
) 

Khi tôi cố gắng thực thi kịch bản thứ hai tôi nhận được lỗi sau (và tôi biết là một cái gì đó liên quan đến mối quan hệ giữa các bảng) và tôi không tìm ra vấn đề có thể xảy ra ở đâu. Tôi là một newbie vào C# và SQL Server, vì vậy hãy tha thứ nếu tôi hỏi một câu hỏi ngu ngốc.

Msg 1776, Level 16, State 0, Line 1
Không có khóa chính hoặc ứng cử viên trong tham chiếu bảng 'AutoCare' phù hợp với danh sách cột tham khảo trong khóa nước ngoài FK_Curse_Autocare '.

Msg 1750, Cấp 16, Tiểu bang 0, Dòng 1
Không thể tạo ràng buộc. Xem các lỗi trước đó.

+2

Bạn có PK tổng hợp trong bảng đầu tiên của hai cột và chỉ tạo FK trên một cột. Đây là vấn đề. Bạn nên thêm cột IdTipAutocar vào bảng thứ hai và tạo FK trên cả cột này và cột IDAutocar. –

+1

có thể trùng lặp của [Không có khóa chính hoặc khóa ứng cử viên nào trong bảng được tham chiếu khớp với danh sách cột tham chiếu trong khoá ngoại] (http://stackoverflow.com/questions/17879735/there-are-no-primary-or- ứng cử viên-khóa-trong-tham chiếu-bảng-đó-phù hợp-the-re) – jpw

+0

Có thể trùng lặp của [Không có khóa chính hoặc ứng cử viên nào trong bảng được tham chiếu] (https://stackoverflow.com/questions/12213301/ có-không-không-chính-hoặc-ứng viên-khóa-trong-tham chiếu-bảng) –

Trả lời

7

bảng của bạn Autocarehợp chất khóa chính tạo thành từ hai cột:

PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC), 

Do đó, bất kỳ bảng có nhu cầu tham khảo Autocarecũng phải cung cấp cả cột trong chìa khóa nước ngoài của họ!

Vì vậy, đây sẽ rõ ràng không công việc:

CONSTRAINT [FK_Curse_Autocare] 
    FOREIGN KEY ([IDAutocar]) 
    REFERENCES [Autocare]([IDAutocar]) 

kể từ khi nó tham chiếu chỉ một của hai cột khóa chính của Autocare.

Bạn cần phải thêm rằng cột thứ hai IDTipAutocar để bàn Curse của bạn và bao gồm nó trong chính nước ngoài của bạn:

CONSTRAINT [FK_Curse_Autocare] 
    FOREIGN KEY ([IDAutocar], [IDTipAutocar]) 
    REFERENCES [Autocare]([IDAutocar], [IDTipAutocar]) 

phím nước ngoài của bạn phải luôn tham khảo cả khóa chính - không chỉ là bộ phận của nó.

1

Khóa ngoại phải tham chiếu khóa duy nhất, có phải là khóa chính hay không. Trong DDL hiện tại của bạn, mã định danh duy nhất (khóa chính) trong Autocare là sự kết hợp của IDAutocarIDTipAutocar. Mặt khác, bạn có Curse tham chiếu Autocare.IDAutocar, không phải là duy nhất.

Bạn có thể thêm IDTipAutocar-Curse (và định nghĩa then chốt đối ngoại):

CREATE TABLE [dbo].[Curse] (
    [IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY, 
    [IDTraseu] NUMERIC (18, 0) NOT NULL, 
    [Data] TIMESTAMP NOT NULL, 
    [IDCompanie] NUMERIC (18, 0) NOT NULL, 
    [NrLocuri] NUMERIC (18, 0) NOT NULL, 
    [IDAutocar] NUMERIC (18, 0) NOT NULL, 
    [IDTipAutocar] NUMERIC (18, 0) NOT NULL, 

    CONSTRAINT [FK_Curse_Trasee] 
     FOREIGN KEY ([IDTraseu]) 
     REFERENCES [Trasee]([IDTraseu]), 
    CONSTRAINT [FK_Curse_Companii] 
     FOREIGN KEY ([IDCompanie]) 
     REFERENCES [Companii]([IDCompanie]), 
    CONSTRAINT [FK_Curse_Autocare] 
     FOREIGN KEY ([IDAutocar], [IDTipAutocar]) 
     REFERENCES [Autocare]([IDAutocar], [IDTipAutocar]) 
) 

Ngoài ra, bạn có thể loại bỏ IDTipAutocar từ định nghĩa khóa chính Autocare 's:

CREATE TABLE [dbo].[Autocare] 
(
    [IDAutocar] NUMERIC (18, 0) NOT NULL, 
    [IDTipAutocar] NUMERIC (18, 0) NOT NULL, 

    PRIMARY KEY CLUSTERED ([IDAutocar] ASC), 

    CONSTRAINT [FK_Autogari_TipAutocar] 
     FOREIGN KEY ([IDTipAutocar]) 
     REFERENCES [dbo].[TipAutocar] ([IDTipAutocar]) 
); 

Trong đó bao giờ làm ý nghĩa hơn từ quan điểm của logic nghiệp vụ của bạn.

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