我知道他們是我的問題是什麼,你如何鏈接它們,或者當你在不同的表中有相同的名字時,它們是否自動鏈接。 這裏是一個例子:有人可以解釋MySQL外鍵
說我有一個[orders]表和一個[customer]表。 [orders]表中的每一行都有一個與[customer]表中的customer_id關聯的customer_id編號。 那麼如何通過參考訂單來獲取客戶信息? 什麼是SQL查詢?
我知道他們是我的問題是什麼,你如何鏈接它們,或者當你在不同的表中有相同的名字時,它們是否自動鏈接。 這裏是一個例子:有人可以解釋MySQL外鍵
說我有一個[orders]表和一個[customer]表。 [orders]表中的每一行都有一個與[customer]表中的customer_id關聯的customer_id編號。 那麼如何通過參考訂單來獲取客戶信息? 什麼是SQL查詢?
http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
對谷歌 「MySQL的外鍵」 進行搜索時第一個結果。完整的例子。
mysql中的外鍵僅適用於某些數據庫引擎。 MyISAM不是其中之一。
我已經嘗試與InnoDB的使用它們,而它確實保證數據的一致性,我發現這是一個巨大的性能擊中,導致該不該被鎖定許多鎖定表。
使用外鍵的主要優點是確保您永遠沒有在數據庫中沒有客戶的訂單。但您仍然需要通過查詢訪問客戶。
select * from customer, order where order.customer_id = customer.id and order.id = 5
上面的查詢顯示瞭如何通過一個懶訪問它加入一個總體思路,雖然它的幹編碼,我可能有一個或兩個錯字在那裏。
我對外鍵的一般想法是,它們很棒,但在MySQL中不可用,並且Postgres處理它們要好得多。
外鍵是而不是通過常用名自動鏈接。經常讓人們對MySQL外鍵感到困惑的一件事是MyISAM表引擎(默認)根本不支持外鍵。將外鍵添加到MyISAM表時,MySQL並沒有提供錯誤消息,而是默默忽略了外鍵定義。外鍵由InnoDB表引擎支持,因此您應該確保您希望添加外鍵的所有表都是InnoDB表類型。要添加一個外鍵,你做這樣的事情:
alter table fk_table add foreign key (fk_column) references pk_table (pk_column);
...你怎麼將它們鏈接或者是當你在不同的表相同的名稱會自動鏈接。
這不是自動的,你必須在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除外),從而強制執行參照完整性。
我假設你問的是因爲你閱讀了文檔,它對你沒有意義。
外鍵(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
。
記住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