簡體   English   中英

MySQL關聯數據庫中的表

[英]MySQL relating tables in the database

在我用來學習PHP和SQL的視頻Tutoria /書中,作者解釋了使數據庫表相互關聯的外鍵的概念。 如您在下圖中所看到的,我們當前正在創建一個名為“ comments”的表。 在此SQL中,有一行photograph_id INT( 11 ) NOT NULL,稱為“外鍵”,作者說該行將“評論”表與現有的“照片”表相關。

我的問題是,由於表稱為“ photographs”(復數為s),但是sql外鍵為“ photograph_id”,SQL如何將兩者連接起來? “ photograph_id”的確切含義是什么,它允許MySQL將其與“ photographs”表關聯。

+-----------------------------+
| Tables_in_C263430_quoralist |
+-----------------------------+
| photographs                 |
| users                       |
+-----------------------------+
2 rows in set (0.21 sec)

mysql> CREATE TABLE comments (
    -> id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> photograph_id INT( 11 ) NOT NULL,
    -> created DATETIME NOT NULL,
    -> author VARCHAR( 255 ) NOT NULL,
    -> body TEXT NOT NULL
    -> );

MySQL不會自動“連接”這兩個表,您必須自己做:

CREATE TABLE comments (
id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
photograph_id INT( 11 ) NOT NULL,
created DATETIME NOT NULL,
author VARCHAR( 255 ) NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (`photograph_id`) REFERENCES `photographs` (`id`) ON DELETE CASCADE
);

這將告訴MySQL您的表comments具有外鍵。 您沒有為鍵指定名稱,因此mysql將自行選擇名稱。 它們的鍵在該表的“ photograph_id ”列上。 鍵是指表格中的photographs ,其列id

也許作者的意思是您使用該列來“模擬”外鍵,這意味着您可以使用該鍵連接到照片的主鍵,而無需真正添加外鍵約束。 因此,數據庫管理員您知道該字段用於關聯,但是數據庫本身不使用該字段(因此不會檢查該字段的完整性:您可以為不存在的照片添加注釋)。

照片表可能如下所示:

photograph_id        image_path
========================================
34343                /images/img_343.jpg
34344                /images/img_344.jpg
34345                /images/img_345.jpg
34346                /images/img_346.jpg
34347                /images/img_347.jpg

這是存儲在數據庫中的一組照片文件名。 請注意,有些人還訴諸於將照片本身以BLOB格式存儲在數據庫中。

創建注釋記錄后,SQL將指定上面的哪些照片記錄用於該照片。

外鍵字段的實際名稱無關緊要; 它主要用於文檔。 對於表,通常的命名約定是它們是每行代表的復數形式,而列名是單數形式。

通過在從屬表(在您的示例中為注釋)中指定外鍵約束,將表綁定在一起。 請注意,用於每個表的存儲引擎會影響外鍵約束是否由系統強制執行。 默認的MyISAM存儲引擎強制限制; InnoDB存儲引擎可以。

@Michael:正如@Konerak所說,您必須自己指定。 默認情況下,MySQL使用MyISAM引擎創建表,對於該表, FOREIGN KEY子句將被忽略。 您的兩個表都必須是InnoDB 我建議您也對MySQL中的外鍵和引用完整性進行一下介紹-http: //www.techrepublic.com/article/an-introduction-to-foreign-keys-and-referential-integrity-in- mysql / 6035435

您必須通過定義外鍵來告訴它。 語法如下:

ALTER TABLE comments ADD CONSTRAINT fk_photgraph_id FOREIGN KEY (photograph_id) REFERENCES photographs (id)

(您可以在CREATE TABLE語句中一次執行相同的操作,但是我更喜歡上面的方法,因為這樣您可以先創建所有表,然后添加外鍵,而不必擔心正確的順序)。

這將告訴MySQL, comments表中的photograph_id列鏈接到photographs表中的id列。 從那時起,MySQL將為您檢查是否有任何photograph_id與有效的photographs.id相關聯; 通過添加ON UPDATEON DELETE語句,您可以控制其執行的精確度-例如,如果指定ON DELETE CASCADE ,則刪除照片還將刪除所有引用該照片的注釋; ON DELETE SET NULL會將注釋的photograph_id設置為NULL; ON DELETE NO ACTION所有評論或將其分配給另一張照片之前,“不刪除ON DELETE NO ACTION和“ ON DELETE RESTRICT將拒絕刪除照片。 級聯刪除功能非常強大,因此在使用它們時要小心。 您可能刪除的東西超出了您的預期,並且數據庫沒有“撤消”按鈕。

需要記住的重要一點是,MySQL中的外鍵僅適用於InnoDB存儲引擎。 MyISAM不支持外鍵。 如果在MyISAM表上指定外鍵,MySQL將很樂意對其進行解析,然后忽略它而不會引發任何錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM