2017年10月11日 星期三

建立FOREIGN KEY條件約束

建立FOREIGN KEY條件約束
建立FOREIGN KEY條件約束的主要目的,就是要將彼此相關的資料表連結起來,以便確保關聯資料表間的參考完整性。

1.      以程式控制方式建立FOREIGN KEY條件約束
a.       於使用CREATE TABLE命令建立資料表的同時將某一欄位定義為外部索引鍵,亦或是使用ALTER TABLE命令替資料表新增欄位時要將某一欄位定義為外部索引鍵;
則可於此欄位定義敘述之後加入下面該引數:
[CONSTRAINT constraint_name]
   [FOREIGN KEY]
   REFERENCES ref_table(ref_column)
語法中的ref_table是想要連結之父資料表名稱。
   ref_column則是父資料表之主索引鍵或UNIQUE條件約束欄位名稱。
  
承上,如果為多個欄位時:
[CONSTRAINT constraint_name]
   [FOREIGN KEY] (column [,…n])
   REFERENCES ref_table(ref_column [,…n])
   語法中的 (column [,…n]) 引數係指定哪些欄位要被定義為外部索引鍵。
   ref_table是想要連結之父資料表名稱。
   (ref_column [,…n]) 引數則是指定父資料表之主索引鍵或UNIQUE條件約束的欄位名稱。
   值得注意的是,(column [,…n]) 引數中的欄位與 (ref_column [,…n]) 引數中的欄位必須一一對應,且彼此之欄位的資料型態(包含欄位的長度)務必相同。
  
範例一:
   欲使用CREATE TABLE命令建立資料表CustomersOrders,並一併以CustomerID欄位為鍵值建立起兩者間的關聯性連結:
/* 檔案名稱: Demo641.sql */
CREATE TABLE Customers
(
CustomerID nchar(5) NOT NULL PRIMARY KEY,
CompanyName nvarchar(40) NOT NULL ,
ContactName nvarchar(30) NULL ,
)

CREATE TABLE Orders
(
OrderID int IDENTITY(1, 1) NOT NULL ,
CustomerID nchar(5) NULL
  CONSTRAINT FK_Orders_Customers
    FOREIGN KEY
    REFERENCES Customers(CustomerID),
OrderDate datetime NULL ,
)

範例二:
承上例,惟此例是在資料表建立完成後,再使用ALTER TABLE命令替兩資料表建立起關聯性連結:
/* 檔案名稱: Demo642.sql */
CREATE TABLE Customers
(
CustomerID nchar(5) NOT NULL PRIMARY KEY,
CompanyName nvarchar(40) NOT NULL ,
ContactName nvarchar(30) NULL ,
)

CREATE TABLE Orders
(
OrderID int IDENTITY(1, 1) NOT NULL ,
CustomerID nchar(5) NULL,
OrderDate datetime NULL ,
)

ALTER TABLE Orders
  ADD
  CONSTRAINT FK_Orders_Customers
  FOREIGN KEY (CustomerID)
  REFERENCES Customers(CustomerID)

範例三:
將資料表Order建立各個FOREIGN KEY條件約束,並將它們分別連結至CustomersEmployessShippers等資料表的主索引鍵,而使它們之間有關聯性:
/* 檔案名稱: Demo643.sql */
ALTER TABLE Orders
  ADD
  CONSTRAINT FK_Orders_Customers
  FOREIGN KEY (CustomerID)
  REFERENCES Customers(CustomerID),
  CONSTRAINT FK_Orders_Employees
  FOREIGN KEY (EmployeeID)
  REFERENCES Employees(EmployeeID),
  CONSTRAINT FK_Orders_Shippers
  FOREIGN KEY (ShipVia)
  REFERENCES Shippers(ShipperID)
範例四:
若欲將多個欄位的組合定義為外部索引鍵,例如:資料表sales的主索引鍵是由stor_idord_numtitle_id三個欄位組成,假設要替某一個資料表建立FOREIGN KEY條件約束並使其連結至資料表sales的主索引鍵,則命令敘述:
/* 檔案名稱: Demo644.sql */
ALTER TABLE ChildTable
  ADD
  CONSTRAINT FK_ChildTable_Sales
  FOREIGN KEY (stor_id, ord_num, title_id)
  REFERENCES Sales(stor_id, ord_num, title_id)
  
b.      移除FOREIGN KEY條件約束
移除FOREIGN KEY條件約束之實質意義,即是移除兩資料表間的關聯性連結。
   (a)使用資料庫圖表,於關聯性連結的連結線按右鍵,選取「從資料庫中刪除關聯性」指令,再「存檔」即可。
   (b)以程式控制方式,語法如下:
      ALTER TABLE table_name
        { DROP
          {
           CONSTRAINT constraint_name
          } [,…n]
        }

     語法中的table_name是子資料表名稱,CONSTRAINT constraint_name引數指欲刪除之FOREIGN KEY條件約束名稱。

沒有留言:

用頭腦去思考,不要人云亦云才好, 宗教信徒就是依賴與自私心態(求東求西)的人, 光是這點就很容易暴露弱點了, 難怪seafood吃飽飽,哈哈。 續上, 除了依賴與自私心態(兩者都是人性)之外。 另外也有很大一部份的人,是人云亦云的思考邏輯, 所以宗教才能譁眾取寵。