1.以下是直接从数据库导出的建表语句。

 1 -- ----------------------------
2 -- Table structure for files
3 -- ----------------------------
4 DROP TABLE IF EXISTS `files`;
5 CREATE TABLE `files` (
6 `id` int(11) NOT NULL,
7 `fileName` varchar(50) DEFAULT NULL,
8 `filePath` varchar(200) DEFAULT NULL,
9 `updateDate` datetime DEFAULT NULL,
10 `userId` int(11) DEFAULT NULL,
11 PRIMARY KEY (`id`)
12 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
13
14 -- ----------------------------
15 -- Table structure for users
16 -- ----------------------------
17 DROP TABLE IF EXISTS `users`;
18 CREATE TABLE `users` (
19 `id` int(11) NOT NULL AUTO_INCREMENT,
20 `name` varchar(30) DEFAULT NULL,
21 `email` varchar(50) DEFAULT NULL,
22 `age` int(11) DEFAULT NULL,
23 `phone` varchar(20) DEFAULT NULL,
24 PRIMARY KEY (`id`)
25 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

2.我们把表files和表users建立关系,给表files添加外键files_users_fk,并在files_users_fk上建立索引。

 1 -- ----------------------------
2 -- Table structure for files
3 -- ----------------------------
4 DROP TABLE IF EXISTS `files`;
5 CREATE TABLE `files` (
6 `id` int(11) NOT NULL,
7 `user_id` int(11) NULL,
8 `fileName` varchar(50) DEFAULT NULL,
9 `filePath` varchar(200) DEFAULT NULL,
10 `updateDate` datetime DEFAULT NULL,
11 `userId` int(11) DEFAULT NULL,
12 PRIMARY KEY (`id`),
13 KEY `files_users_fk` (`user_id`)
14 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
15
16 -- ----------------------------
17 -- Table structure for users
18 -- ----------------------------
19 DROP TABLE IF EXISTS `users`;
20 CREATE TABLE `users` (
21 `id` int(11) NOT NULL AUTO_INCREMENT,
22 `name` varchar(30) DEFAULT NULL,
23 `email` varchar(50) DEFAULT NULL,
24 `age` int(11) DEFAULT NULL,
25 `phone` varchar(20) DEFAULT NULL,
26 PRIMARY KEY (`id`)
27 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
28
29 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;

--

【MySQL】Create table 以及 foreign key 删表顺序考究。的更多相关文章

  1. MySQL完整性约束foreign key与表操作。

    一  MySQL中表的完整性约束: 我们首先知道约束条件跟类型的宽度一样,都是可选的,也就是说,我们在创建表的时候可以不指定,但是为了创建的表更加的完整,我们一般会加一些约束条件,name下面我们讲一 ...

  2. [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]

    [MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...

  3. MySQL Create Table创建表

    表的创建命令需要: 表的名称 字段名称 定义每个字段(类型.长度等) 语法 下面是通用的SQL语法用来创建MySQL表: CREATE TABLE table_name (column_name co ...

  4. MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)

    一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...

  5. MySQL create table 语法

    MySQL中create table语句的基本语法是: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name     [(create_definitio ...

  6. MySQL create table语法详解

    前面在查建表时key和index的区别时,发现建表语句包含了太多信息,于是完整看看官方手册的这一小节. 该文章根据MySQL 5.7的手册作笔记,而MySQL 8.0该节地址如下: https://d ...

  7. mysql create table 语法详解

    create table 可以分成三类 一.一般create table 语句: 1 语法 create [temporary] table [if not exists] tbl_name (cre ...

  8. MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】

    删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCAD ...

  9. mysql CREATE TABLE语句 语法

    mysql CREATE TABLE语句 语法 作用:创建数据库中的表. 大理石量具系列 语法:CREATE TABLE 表名称 (列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,.... ...

随机推荐

  1. js中的按键事件

    参考链接:http://blog.csdn.net/zhouziyu2011/article/details/53978293 <input type="text" id=& ...

  2. 面向移动设备的html5开发框架

    很久以前整理了篇将手机网站做成手机应用的JS框架.时隔一年多,很多新的技术已经出现,下面再来总结下还有哪些框架是适合面向手机设备的开发的. 1.jQuery Mobile jQuery Mobile ...

  3. LeetCode Intersection of Two Arrays

    原题链接在这里:https://leetcode.com/problems/intersection-of-two-arrays/ 题目: Given two arrays, write a func ...

  4. 利用缓存实现APP端与服务器接口交互的Session控制

    与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...

  5. Ext小总结

    titleCollapse:true,//高级搜索点击隐藏显示 添加按钮 >弹出页面 1.添加按钮 //核销  在控制层页面添加页面路径>添加操作按钮>window.allOrder ...

  6. Computer vision labs

    积累记录一些视觉实验室,方便查找 1.  多伦多大学计算机科学系 2.  普林斯顿大学计算机视觉和机器人实验室 3.  牛津大学Torr Vision Group 4.  伯克利视觉和学习中心 Pro ...

  7. RequireJS中的require如何返回模块

    requirejs中定义AMD模块规则如下: define(function(){ var ProductManager={ Create:function(){ console.log(" ...

  8. 理解C# 4 dynamic(2) – ExpandoObject的使用

    ExpandoObject的使用非常简单,很容易入手.上一篇里面已经有详细的介绍了,可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic ...

  9. 最为简易的yii 教程(一)

    了解目录的框架结构 framework主要有 base          框架核心组件 caching        缓存组件 db                数据库组件 gii          ...

  10. yii 核心类classes.php详解(持续更新中...)

    classes.php在yii运行的时候将被自动加载,位于yii2文件夹底下. <?php /** * Yii core class map. * * This file is automati ...