5

Nếu tôi khai báo bảng dưới đây, nó ngầm ngụ ý rằng cả khóa ngoài tạo khóa chính duy nhất hoặc tôi có cần phải làm gì khác để tạo cả hai thuộc tính làm khóa chính không?SQL Nhiều Phím Nước ngoài là Khóa Chính

CREATE TABLE Report_has_Items 
(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL 
) 

Về cơ bản cả hai thuộc tính là khóa ngoài từ các bảng khác, cùng nhau sẽ tạo thành một khóa duy nhất.

Trả lời

9

Không, không. Bảng trên không có khóa chính. Nếu bạn muốn sử dụng các trường dưới dạng khóa chính sử dụng:

CREATE TABLE Report_has_Items(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL, 
    PRIMARY KEY (ReportID, ItemID) 
) 

hoặc thứ gì đó tương tự tùy thuộc vào độ lệch sql của bạn.

3

Tôi không chắc chắn tôi hiểu câu hỏi của bạn hoàn toàn nhưng tôi cho rằng bạn đang cố gắng tạo khóa tổng hợp chính (khóa chính có nhiều hơn một thuộc tính). Bạn có thể làm như sau.

CREATE TABLE Report_has_Items(
    ReportID int references Report(ReportID), 
    ItemID int references Item(ItemID), 
    PRIMARY KEY (ReportID , ItemID) 
); 

Note: Cặp (ReportID, ItemID) sau đó phải là duy nhất cho bảng và không phải giá trị có thể là NULL.

Here is a very useful link for SQL Queries

5

Hãy đặt tên cho những hạn chế của chúng tôi, eh?

CREATE TABLE dbo.Report_has_Items(
    ReportID int NOT NULL, 
     CONSTRAINT [FK_RHI_Report] (ReportId) REFERENCES dbo.Report(ReportID), 
    ItemID int NOT NULL, 
     Constraint [FK_RHI_Item] (ItemId) REFERENCES dbo.Item(ItemID), 
    CONSTRAINT [PK_RHI] PRIMARY KEY (ReportID, ItemID) 
) 
+0

Lợi ích của việc đặt tên hạn chế là gì? – Kairan

+1

@Kairan - Một lợi ích chính là, nếu một truy vấn (chèn, cập nhật, xóa) vi phạm một ràng buộc, một thông báo lỗi sẽ được tạo ra với tên ràng buộc. Nếu tên ràng buộc rõ ràng và mô tả, thông báo lỗi sẽ dễ hiểu hơn; nếu tên ràng buộc là ngẫu nhiên, nó sẽ ít rõ ràng hơn. – Gayu

+0

Lý do chính cho tôi là sự nhất quán giữa các môi trường. Tôi là một DBA hỗ trợ. Một phần của công việc đó là di chuyển các thay đổi từ DEV sang QA thành PROD. Tôi sử dụng một công cụ so sánh lược đồ cho việc này. Thật tuyệt nếu các ràng buộc được đặt tên giống nhau sao cho sự khác biệt trong việc đặt tên không bị gắn cờ là sự khác biệt. –

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