2009-08-20 82 views
41

Làm thế nào để bạn tạo mối quan hệ một đến nhiều bằng cách sử dụng SQL Server?Tạo mối quan hệ một đến nhiều bằng cách sử dụng SQL Server

+2

Giáo sư của tôi tại USC đã cho chúng tôi biết quy tắc đơn giản này: khi có một mối quan hệ với nhiều người, hãy đặt khóa của 'một' làm khóa ngoại ở phía 'nhiều'. Và khi có nhiều mối quan hệ, hãy đặt cả hai khóa làm khóa ngoài trong bảng thứ ba. – user3885927

Trả lời

71
  1. Xác định hai bảng (ví dụ A và B), với họ riêng chính chủ chốt
  2. Xác định một cột trong Bảng A như có một mối quan hệ chính nước ngoài dựa trên khóa chính của bảng B

Điều này có nghĩa là Bảng A có thể có một hoặc nhiều hồ sơ liên quan đến một bản ghi duy nhất trong Bảng B.

Nếu bạn đã có bảng, hãy sử dụng câu lệnh ALTER TABLE để tạo ràng buộc khóa ngoài:

ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY (b_id) references b(id) 
  • fk_b: Tên của ràng buộc khoá ngoại, phải là duy nhất cơ sở dữ liệu
  • b_id: Tên cột trong Bảng A bạn đang tạo mối quan hệ khoá ngoại trên
  • b: Tên của bảng, trong trường hợp này b
  • id: Tên của cột trong bảng b
+0

cách dễ nhất để "Xác định cột trong Bảng A là có mối quan hệ khóa ngoài dựa trên khóa chính của Bảng B" – Tim

+0

@George: Cập nhật để bao gồm lệnh ALTER TABLE ADD CONSTRAINT, giả sử các bảng tồn tại. –

+0

Bạn đã giải thích điều này một cách hoàn hảo cảm ơn bạn. Hy vọng rằng Microsoft cuối cùng sẽ học cách làm như vậy. – Lopsided

0

Nếu bạn đang nói về hai loại enitities , nói giáo viên và học sinh, bạn sẽ tạo ra hai bảng cho mỗi và một bảng thứ ba để lưu trữ mối quan hệ. Bảng thứ ba này có thể có hai cột, nói giáo viênID và StudentId. Nếu đây không phải là những gì bạn đang tìm kiếm, hãy xây dựng câu hỏi của bạn.

+0

Tôi không nghĩ rằng đây là những gì tôi muốn. Tôi đã chuẩn hóa một bảng và bây giờ tôi muốn tạo ra một mối quan hệ. – Tim

+5

bỏ phiếu xuống do giải pháp được cung cấp là một giải pháp cho mối quan hệ nhiều-nhiều. Ngay cả khi sử dụng cho một-nhiều, đây là thêm chi phí khi phải chạy tham gia. Cộng với bạn phải tham gia bên trong qua 3 bảng, do đó nhiều hơn để gõ. – andrewWinn

+0

Cái này được sử dụng để tạo mối quan hệ m-n :) – nXqd

2

Đây là cách tôi thường làm điều đó (sql server).

Create Table Master (
MasterID int identity(1,1) primary key, 
Stuff varchar(10) 
) 
GO 
Create Table Detail (
DetailID int identity(1,1) primary key, 
MasterID int references Master, --use 'references' 
Stuff varchar(10)) 
GO 
Insert into Master values('value') 
--(1 row(s) affected) 
GO 
Insert into Detail values (1, 'Value1') -- Works 
--(1 row(s) affected) 
insert into Detail values (2, 'Value2') -- Fails 
--Msg 547, Level 16, State 0, Line 2 
--The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Detail__MasterID__0C70CFB4". 
--The conflict occurred in database "Play", table "dbo.Master", column 'MasterID'. 
--The statement has been terminated. 

Như bạn có thể thấy lần chèn thứ hai vào chi tiết không thành công do khóa ngoại. Đây là một liên kết web tốt hiển thị nhiều cú pháp khác nhau để xác định FK trong khi tạo bảng hoặc sau.

http://www.1keydata.com/sql/sql-foreign-key.html

58

Đây là một ví dụ đơn giản của một tấm gương tự cổ điển. Mỗi Khách hàng có thể có nhiều Đơn đặt hàng s và mỗi Đơn đặt hàng có thể bao gồm nhiều Đơn hàng số s.

Bạn tạo mối quan hệ bằng cách thêm cột foreign key. Mỗi bản ghi Order có một CustomerID trong nó, trỏ đến ID của khách hàng. Tương tự, mỗi OrderLine có một giá trị OrderID. Đây là cách sơ đồ cơ sở dữ liệu trông:

SQL one-to-many diagram http://www.subbot.net/personal/external/stackoverflow/sql-one-to-many.png

Trong sơ đồ này, có thực tế foreign key constraints. Chúng là tùy chọn, nhưng chúng đảm bảo tính toàn vẹn của dữ liệu của bạn. Ngoài ra, họ làm cho cấu trúc của cơ sở dữ liệu của bạn rõ ràng hơn cho bất cứ ai sử dụng nó.

Tôi giả sử bạn biết cách tự tạo bảng. Sau đó, bạn chỉ cần xác định mối quan hệ giữa chúng. Tất nhiên bạn có thể định nghĩa các ràng buộc trong T-SQL (như được đăng bởi nhiều người), nhưng chúng cũng dễ dàng được thêm vào bằng cách sử dụng trình thiết kế. Sử dụng SQL Management Studio, bạn có thể nhấp chuột phải vào bảng Đơn đặt hàng, nhấp vào Thiết kế (Tôi nghĩ nó có thể được gọi là Chỉnh sửa dưới 2005). Sau đó, bất kỳ nơi nào trong cửa sổ mở ra nhấp chuột phải và chọn Mối quan hệ.

Bạn sẽ nhận được một hộp thoại khác, ở bên phải có chế độ xem lưới. Một trong những dòng đầu tiên đọc "Đặc điểm bảng và cột". Nhấp vào dòng đó, sau đó nhấp lại vào nút [...] nhỏ xuất hiện ở bên phải. Bạn sẽ nhận được hộp thoại này:

Foreign key constraint http://www.subbot.net/personal/external/stackoverflow/sql-fk.png

Các tự bảng nên đã được chọn ở bên phải. Chọn bảng Khách hàng ở menu thả xuống bên trái. Sau đó, trong lưới bên trái, chọn cột ID. Trong lưới bên phải, chọn cột CustomerID. Đóng hộp thoại và tiếp theo. Nhấn Ctrl + S để lưu.

Có ràng buộc này sẽ đảm bảo rằng không có Hồ sơ đặt hàng nào có thể tồn tại mà không có hồ sơ Khách hàng kèm theo.

Để truy vấn cơ sở dữ liệu hiệu quả như thế này, bạn có thể muốn read up on JOINs.

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