2009-08-20 34 views
41

如何使用SQL Server創建一對多關係?使用SQL Server創建一對多關係

+2

我在USC的教授告訴我們這個簡單的規則:當有一對多的關係時,把'一邊'作爲外鍵放在'多邊'一邊。當有多對多的關係時,把兩個鍵作爲外鍵放在第三個表中。 – user3885927 2017-08-02 22:22:18

回答

71
  1. 定義的兩個表(例如A和B),用自己的主鍵
  2. 定義於表A中的列作爲基於表B的

主鍵具有外鍵關係這意味着該表中可以有一個或多個與在表B.

一個記錄的記錄如果您已經到位的表,使用ALTER TABLE語句創建外鍵約束:

ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY (b_id) references b(id) 
  • fk_b:外鍵約束的名稱,必須是唯一的數據庫
  • b_id:在表A中所創建的
  • b的外鍵關係列的名稱:表的名稱,在這種情況b
  • id:表b列的名稱
+0

「將表A中的列定義爲具有基於表B的主鍵的外鍵關係」的最簡單方法是什麼 – Tim 2009-08-20 19:35:17

+0

@George:已更新以包含ALTER TABLE ADD CONSTRAINT命令(假設存在表)。 – 2009-08-20 19:54:33

+0

你對此解釋完全謝謝。希望微軟最終會學習如何做同樣的事情。 – Lopsided 2013-07-02 17:50:25

0

如果你在談論關於兩類不同enitities的,老師和學生說,你會爲每個創建兩個表,第三個存儲關係。這第三個表格可以有兩列,比如teacherID和StudentId。 如果這不是你正在尋找的,請詳細說明你的問題。

+0

我不認爲這是我想要的。我規範化了一張桌子,現在我想創建一個關係。 – Tim 2009-08-20 19:38:38

+5

由於所提供的解決方案是向下投票,因此是多對多關係之一。即使使用一對多,當必須運行連接時,這也是額外的開銷。另外,您必須在3個表格內部連接,因此需要更多類型的連接。 – andrewWinn 2009-08-20 19:40:00

+0

這個是用來創建m-n關係的:) – nXqd 2011-01-14 20:37:05

2

這是怎麼了,我通常做(SQL服務器)。

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. 

正如你可以看到第二個插入到細節,因爲外鍵的失敗。 這是一個很好的網絡鏈接,它顯示了在表創建或之後定義FK的各種語法。

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

58

這是一個典型的例子令一個簡單的例子。每個客戶可以有多個訂單 s,並且每個訂單可以包括多個訂單行 s。

您可以通過添加foreign key列來創建關係。每個訂單記錄都有一個CustomerID,它指向客戶的ID。同樣,每個OrderLine都有一個OrderID值。這是數據庫圖表的外觀:

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

在此圖中,有實際foreign key constraints。它們是可選的,但它們確保數據的完整性。另外,它們使數據庫的結構更清晰,以供使用它的任何人使用。

我假設你知道如何自己創建表。那麼你只需要定義它們之間的關係。您當然可以在T-SQL中定義約束(由多人發佈),但也可以使用設計器輕鬆添加。使用SQL Management Studio,你可以右擊訂單表,點擊設計(我認爲它可能被稱爲2005年編輯)。然後,在打開右鍵單擊的窗口中的任意位置選擇關係

你會得到另一個對話框,在右邊應該有一個網格視圖。第一行的其中一行顯示「表格和列說明」。點擊該行,然後再次點擊右側出現的小[...]按鈕。你會得到這個對話框:

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

訂購表應該已經在正確的選擇。選擇左側下拉菜單中的客戶表。然後在左側網格中,選擇ID列。在右側網格中,選擇CustomerID列。關閉對話框,然後關閉對話框。按Ctrl + S保存。

擁有這個約束將確保在沒有伴隨的客戶記錄的情況下不存在訂單記錄。

要有效地查詢這樣的數據庫,您可能需要read up on JOINs