主鍵是表內記錄的唯一身份證,外鍵是跨表引用的橋梁。以論壇「主貼 thread / 回帖 reply」為例,通俗講解主外鍵關系,並用「大哥/小弟」完整演示建表、插入、約束報錯、級聯刪除全流程。
thread.php?id=1 精準定位主貼。reply.thread_id 指向 thread.id。刪主貼時,若定義 ON DELETE CASCADE,MySQL 自動刪除所有回帖,無需應用雙重 DELETE。INSERT INTO dage(name) VALUES('銅鑼灣');
SELECT * FROM dage; -- id=1, 銅鑼灣
2. 插入小弟
DELETE FROM dage WHERE id=1; -- ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
4. 插入不存在大哥的小弟(報錯)
ALTER TABLE xiaodi DROP FOREIGN KEY xiaodi_ibfk_1; ALTER TABLE xiaodi ADD FOREIGN KEY(dage_id) REFERENCES dage(id) ON DELETE CASCADE ON UPDATE CASCADE; DELETE FROM dage WHERE id=1; -- Query OK, 1 row affected SELECT * FROM dage; -- Empty set SELECT * FROM xiaodi; -- Empty set
外鍵讓數據庫自動維護引用完整性,ON DELETE CASCADE 適合「強依賴」場景(如訂單/明細),ON DELETE RESTRICT 適合「弱依賴/需人工審核」場景。實戰中根據業務語義選擇。