程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> 【MySQL】Create table 以及 foreign key 刪表順序考究。

【MySQL】Create table 以及 foreign key 刪表順序考究。

編輯:MYSQL入門知識

1.以下是直接從數據庫導出的建表語句。

 -- ----------------------------
 -- Table structure for files
 -- ----------------------------
 DROP TABLE IF EXISTS `files`;
 CREATE TABLE `files` (
   `id` int(11) NOT NULL,
   `fileName` varchar(50) DEFAULT NULL,
   `filePath` varchar(200) DEFAULT NULL,
   `updateDate` datetime DEFAULT NULL,
   `userId` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 -- ----------------------------
 -- Table structure for users
 -- ----------------------------
 DROP TABLE IF EXISTS `users`;
 CREATE TABLE `users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(30) DEFAULT NULL,
   `email` varchar(50) DEFAULT NULL,
   `age` int(11) DEFAULT NULL,
   `phone` varchar(20) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

2.我們把表files和表users建立關系,給表files添加外鍵files_users_fk,並在files_users_fk上建立索引。

 -- ----------------------------
 -- Table structure for files
 -- ----------------------------
 DROP TABLE IF EXISTS `files`;
 CREATE TABLE `files` (
   `id` int(11) NOT NULL,
   `user_id` int(11) NULL,
   `fileName` varchar(50) DEFAULT NULL,
   `filePath` varchar(200) DEFAULT NULL,
   `updateDate` datetime DEFAULT NULL,
   `userId` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `files_users_fk` (`user_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 -- ----------------------------
 -- Table structure for users
 -- ----------------------------
 DROP TABLE IF EXISTS `users`;
 CREATE TABLE `users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(30) DEFAULT NULL,
   `email` varchar(50) DEFAULT NULL,
   `age` int(11) DEFAULT NULL,
   `phone` varchar(20) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
 
 ALTER TABLE files ADD CONSTRAINT files_users_fk FOREIGN KEY(`user_id`) REFERENCES users(`id`);

可以看出 files 依賴表users ,依賴表不能先刪除。也就是說,需要先刪除當前表,再刪除外鍵關聯表

 

我們來看看概念:

先看On Delete屬性,可能取值為:No Action, Cascade,Set Null, Restrict屬性。

當取值為No Action或者Restrict時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。

當取值為Cascade時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。

當取值為Set Null時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。 

On Update是一樣的?

當取值為No Action或者Restrict時,則當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許更新。

當取值為Cascade時,則當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也更新外鍵在子表(即包含外鍵的表)中的記錄。

當取值為Set Null時,則當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。

 

比如:

ALTER TABLE files ADD CONSTRAINT files_users_fk FOREIGN KEY(`user_id`) REFERENCES users(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

 

-- 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved