2010-07-05 57 views
16

Câu hỏi này là khá tương tự như nhiều để this one, nhưng đối với SQL Server 2005:chìa khóa ngoại tham khảo 2 cột khóa chính trong SQL Server

Tôi có 2 bảng trong cơ sở dữ liệu của tôi:

--'#' denotes the primary key 
[Libraries] 
#ID #Application Name 
1  MyApp  Title 1 
2  MyApp  Title 2 


[Content] 
#ID Application LibraryID Content 
10 MyApp  1   xxx 
11 MyApp  1   yyy 

(các cơ sở dữ liệu rõ ràng phức tạp hơn nhiều và có khóa kép này có ý nghĩa)

Mỗi thư viện được xác định bằng ID và Tên ứng dụng duy nhất của nó. Tôi đang cố gắng đảm bảo rằng mỗi nội dung đều tham chiếu đúng một thư viện hiện có.

Khi tạo các hạn chế (sử dụng Wizard) như

Primary key table   Foreign key table 
[Libraries]     [Content] 
ID     --->  LibraryID 
Application   --->  Application 

Tôi có lỗi sau:

The columns in table 'Libraries' do not match an existing primary key or UNIQUE constraint

Bạn có bất cứ ý tưởng về những gì đang xảy ra vậy? và nếu nó có thể ở tất cả bằng cách sử dụng SQL Server? (Tôi hoàn toàn không thể sửa đổi bảng [Thư viện])

Cảm ơn rất nhiều sự giúp đỡ của bạn!

Trả lời

33

Tất nhiên, có thể tạo mối quan hệ khóa ngoài với khóa chính (nhiều hơn một cột). Bạn không hiển thị cho chúng tôi tuyên bố bạn đang sử dụng để thử và tạo mối quan hệ đó - nó phải giống như sau:

ALTER TABLE dbo.Content 
    ADD CONSTRAINT FK_Content_Libraries 
    FOREIGN KEY(LibraryID, Application) 
    REFERENCES dbo.Libraries(ID, Application) 

Đó có phải là những gì bạn đang sử dụng không ?? Nếu (ID, Application) thực sự là khóa chính trên dbo.Libraries, tuyên bố này chắc chắn sẽ hoạt động.

Luk: chỉ để kiểm tra - bạn có thể chạy câu lệnh này trong cơ sở dữ liệu của bạn và báo cáo lại đầu ra là gì không ??

SELECT 
    tc.TABLE_NAME, 
    tc.CONSTRAINT_NAME, 
    ccu.COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
INNER JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
     ON ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
WHERE 
    tc.TABLE_NAME IN ('Libraries', 'Content') 
+0

Tôi đã sử dụng giao diện người dùng trực tiếp tại thời điểm đó, nhưng việc sử dụng cú pháp của bạn sẽ làm tăng lỗi sau: "Không có khóa chính hoặc khóa ứng viên trong bảng tham chiếu 'dbo.Libraries' khớp với danh sách cột tham chiếu trong khóa ngoại. .. – Luk

+0

Vâng, trong trường hợp đó, cặp (Id, ứng dụng) là ** không ** khóa chính trên bảng Libraries.Bạn chỉ có thể tham chiếu khóa chính trên bảng cha - hoặc cột (hoặc tập hợp các cột) Đó là một phần của một chỉ mục duy nhất Kiểm tra bảng 'Thư viện' của bạn! –

+0

Đó cũng là suy nghĩ đầu tiên của tôi, nhưng tập lệnh SQL chỉ định ' TẠO BẢNG [Thư viện] ('...' CONSTRAINT [PK_sf_Libraries] PRIMARY KEY CLUSTERED ([Ứng dụng] ASC, [ID] ASC) VỚI (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = TẮT, IGNORE_DUP_KEY = TẮT, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] '... (xin lỗi vì dum ping tất cả các SQL ở đây) – Luk

1

Các Content bảng có thể có nhiều trùng lặp Application giá trị mà không thể được ánh xạ tới Libraries. Có thể thả cột Application từ chỉ số chính Libraries và thêm nó làm chỉ mục khóa duy nhất thay thế không?

+0

Có, có thể trùng lặp cho 'Ứng dụng' nhưng không bao giờ được yêu cầu là duy nhất. Cặp '(LibraryID, Application)' thậm chí có thể có nhiều giá trị - đó không phải là PK trên bảng 'Nội dung' - đó là PK trên bảng' Thư viện'! –

+0

OK, vậy điều gì sẽ xảy ra khi bạn có (LibraryID, Application) từ Nội dung không tương ứng với (ID, Ứng dụng) trên Thư viện? Hiện tại, không có ràng buộc để thực thi điều đó. Nếu OP không muốn thay đổi cấu trúc hiện tại, tôi khuyên bạn nên thử tạo một chỉ mục Khóa duy nhất trên (LibraryID, Application) và xem liệu nó có thể được tạo thành công hay không. Chỉ khi đó, hãy thử tạo lại mối quan hệ. –

+0

Thật không may, tôi không thể chạm vào 'Thư viện'. Hai bảng được cho là có mối quan hệ 1-1 vì tôi không thể thêm các cột mới vào 'Thư viện'. Bạn đúng, chỉ mục duy nhất là bắt buộc ở đó (nhưng điều đó không khắc phục được sự cố) – Luk

0

Tôi gặp vấn đề tương tự và tôi nghĩ mình có giải pháp.

Nếu trường của bạn Application trong bảng Library có một khóa ngoại tham chiếu đến một lĩnh vực trong một bảng (tên Application tôi sẽ đặt cược), sau đó lĩnh vực của bạn Application trong bảng Library phải có một khóa ngoại đến bảng Application quá.

Sau đó, bạn có thể thực hiện khóa ngoại ngữ sáng tác của mình.

Xin lỗi tiếng anh nghèo của tôi và xin lỗi nếu tôi sai.

7

Lưu ý rằng các trường phải theo cùng thứ tự. Nếu khóa chính bạn đang tham chiếu được chỉ định là (Application, ID) thì khóa ngoại của bạn phải tham chiếu (Application, ID) và NOT (ID, Application) vì chúng được xem như hai khóa khác nhau.

+0

Tôi nghi ngờ đây là vấn đề đặc biệt.kể từ khi ông liệt kê "Ứng dụng" đầu tiên trong khóa chính của mình ("PRIMARY KEY CLUSTERED ([Ứng dụng] ASC, [ID] ASC)") trong "Jul 5'10 at 15:07" của mình bình luận cho câu trả lời được chấp nhận ("marc_s's vào "Jul 5 '10 at 10:26") nhưng "ID" đầu tiên trong cả hai ví dụ của mình trong OP của mình. Tôi ngạc nhiên không ai khác (bao gồm 500 (pinky-to-lips) THOUSAND nhiều Rep'ed "marc_s") chỉ ra rằng trong 4 năm 8 trước khi bạn. – Tom

0

Điều quan trọng là "thứ tự của các cột nên được như vậy"

Ví dụ:

create Table A (
    A_ID char(3) primary key, 
    A_name char(10) primary key, 
    A_desc desc char(50) 
) 

create Table B (
    B_ID char(3) primary key, 
    B_A_ID char(3), 
    B_A_Name char(10), 
    constraint [Fk_B_01] foreign key (B_A_ID,B_A_Name) references A(A_ID,A_Name) 
) 

thứ tự cột vào bảng A nên ->A_ID sau đó A_Name; xác định khóa ngoại sẽ theo cùng một thứ tự.

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