【MySQL】Create table 以及 foreign key 删表顺序考究。
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 删表顺序考究。的更多相关文章
- MySQL完整性约束foreign key与表操作。
一 MySQL中表的完整性约束: 我们首先知道约束条件跟类型的宽度一样,都是可选的,也就是说,我们在创建表的时候可以不指定,但是为了创建的表更加的完整,我们一般会加一些约束条件,name下面我们讲一 ...
- [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]
[MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...
- MySQL Create Table创建表
表的创建命令需要: 表的名称 字段名称 定义每个字段(类型.长度等) 语法 下面是通用的SQL语法用来创建MySQL表: CREATE TABLE table_name (column_name co ...
- MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...
- MySQL create table 语法
MySQL中create table语句的基本语法是: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definitio ...
- MySQL create table语法详解
前面在查建表时key和index的区别时,发现建表语句包含了太多信息,于是完整看看官方手册的这一小节. 该文章根据MySQL 5.7的手册作笔记,而MySQL 8.0该节地址如下: https://d ...
- mysql create table 语法详解
create table 可以分成三类 一.一般create table 语句: 1 语法 create [temporary] table [if not exists] tbl_name (cre ...
- MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】
删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCAD ...
- mysql CREATE TABLE语句 语法
mysql CREATE TABLE语句 语法 作用:创建数据库中的表. 大理石量具系列 语法:CREATE TABLE 表名称 (列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,.... ...
随机推荐
- JSHint配置项说明
转自:http://www.jianshu.com/p/4cb23f9e19d3 什么是JSHint? 官方网站这样介绍: JSHint, A Static Code Analysis Tool fo ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化
往往开发的人不是维护的人,开发的单位不是维护的单位.信息的畅通沟通交流很多时候会有打折.扭曲.甚至是容易得到歪解.配置错业务操作权限.为了防止发生没必要的麻烦,甚至是发生重大错误,我们的软件需要不断换 ...
- Office2013插件开发Outlook篇(1)-- 第一个office2013插件
一.环境: 下载VS2013安装,记得安装office插件开发包哦. 二.新建Outlook插件项目
- Flink 1.1 – ResourceManager
Flink resource manager的作用如图, FlinkResourceManager /** * * <h1>Worker allocation steps</h1 ...
- 移动UI设计
移动应用UI设计模式 第二版 导航:跳板式,菜单式,选项卡式(微信)等 表单:登录表单,多步骤表单(递进式),计算表单,搜索表单,长表单等 表格:无表头表格,概览+数据型表格等 搜索:隐式搜索(滴滴打 ...
- Mybatis使用总结
一.最基本的配置文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurati ...
- 显式意图启动一个Activity
显式意图主要是通过指定包名和类名开启一个组件,主要用于安全性要求高的,且不想被其他应用开启,可以不配置应用过滤器. 1.创建意图对象 Intent intent = new Intent(); 2.指 ...
- canvas弹动2
在上一次的例子上加深一点点,这次我们选择动态的绑定目标点,三个目标相互转化,实现的思路是以拖拽点为目标计算出除了拖拽点以外的两个圆球的位置 以上个案例的公式,设点分别为A,B,C,当我拖拽点A时其余两 ...
- 我的第一篇blog
加入博客园两年多了,学习.从事编程也两年多了,一直是在网上找资料,都没有认真写写博客. 博客园里面好多功能都还不会用,今天起我也要在博客园写自己的blog了.感觉很高大上的样纸!!
- BZOJ 1432: [ZJOI2009]Function
1432: [ZJOI2009]Function Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1046 Solved: 765[Submit][Sta ...