2009-11-13 95 views
5

我知道他們是我的問題是什麼,你如何鏈接它們,或者當你在不同的表中有相同的名字時,它們是否自動鏈接。 這裏是一個例子:有人可以解釋MySQL外鍵

說我有一個[orders]表和一個[customer]表。 [orders]表中的每一行都有一個與[customer]表中的customer_id關聯的customer_id編號。 那麼如何通過參考訂單來獲取客戶信息? 什麼是SQL查詢?

回答

1

mysql中的外鍵僅適用於某些數據庫引擎。 MyISAM不是其中之一。

我已經嘗試與InnoDB的使用它們,而它確實保證數據的一致性,我發現這是一個巨大的性能擊中,導致該不該被鎖定許多鎖定表。

使用外鍵的主要優點是確保您永遠沒有在數據庫中沒有客戶的訂單。但您仍然需要通過查詢訪問客戶。

select * from customer, order where order.customer_id = customer.id and order.id = 5 

上面的查詢顯示瞭如何通過一個懶訪問它加入一個總體思路,雖然它的幹編碼,我可能有一個或兩個錯字在那裏。

我對外鍵的一般想法是,它們很棒,但在MySQL中不可用,並且Postgres處理它們要好得多。

4

外鍵是而不是通過常用名自動鏈接。經常讓人們對MySQL外鍵感到困惑的一件事是MyISAM表引擎(默認)根本不支持外鍵。將外鍵添加到MyISAM表時,MySQL並沒有提供錯誤消息,而是默默忽略了外鍵定義。外鍵由InnoDB表引擎支持,因此您應該確保您希望添加外鍵的所有表都是InnoDB表類型。要添加一個外鍵,你做這樣的事情:

alter table fk_table add foreign key (fk_column) references pk_table (pk_column); 
+0

記住MySQL在表創建時默默丟棄內聯外鍵語法也很重要,例如, CREATE TABLE foo(... bar int(5)unsigned not null references baz(bar)...)ENGINE = InnoDB; ** **不會創建外鍵。總是在字段聲明後指定外鍵爲CREATE ...(... FOREIGN KEY key_name(column_name)REFERENCES foreign_table(foreign_column)ON UPDATE ... ON DELETE ...)'語法。希望這可以幫助。 – Dereleased 2009-11-13 18:14:22

7

...你怎麼將它們鏈接或者是當你在不同的表相同的名稱會自動鏈接。

這不是自動的,你必須在order表的customer_id列添加一個foreign key constraint。這可以在創建表時或使用ALTER語句完成。檢查文檔的細節。正如其他人指出的那樣,請注意兩個表都需要是InnoDB表(MyISAM存儲引擎不支持外鍵約束,它們將忽略它們)。

不管有沒有FK約束,查詢將是這樣的:

SELECT * 
FROM CUSTOMER C, ORDER O 
WHERE C.ID = O.CUSTOMER_ID 
AND O.ID = ... 

一個FK約束將「公正」保證該順序表的CUSTOMER_ID列不能包含不存在價值CUSTOMER表(可能爲NULL除外),從而強制執行參照完整性。

3

我假設你問的是因爲你閱讀了文檔,它對你沒有意義。

外鍵(FK)是TableB中的一個字段,它與TableA中的字段(通常是主鍵(PK))保持相同的值。因此,在僞代碼:

Create TableA: 
A_id is PK, 
somefield, 
anotherfield 

Create TableB: 
B_id is PK, 
A_id is FK to TableA, 
farmfield, 
outstandingfield 

Create constraint on TableB: 
In TableB A_id references TableA(A_id), 
Don't allow updates to TableA(A_id), 
Delete records from TableB that have the same A_id as deleted records in TableA 

然後當你這樣做,既涉及表的查詢,你可以加入你的FK:

SELECT a.somefield, b.farmfield FROM TableA a JOIN TableB b ON (a.A_id=B.A_id); 

而當你從表A中刪除,您不必刪除來自TableB。它會自動發生,因爲約束表示「刪除TableB中與TableA中已刪除記錄具有相同A_id的記錄」。

而當您插入到TableB中時,您必須提供有效的A_id,或者,根據您定義列的方式,請留下A_id =NULL

+0

你如何在TableB上創建一個約束(whats the query)? – Ross 2009-11-13 18:24:09

+0

這將在我認爲你閱讀的手冊中:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html – dnagirl 2009-11-13 18:49:59

+0

-1因爲:「我會假設你在問,因爲你閱讀了文檔,而且它對你沒有意義。「這是一個相當傲慢的話 - 在這個問題上完全沒有必要。 – jwir3 2011-03-01 00:37:15