zoukankan      html  css  js  c++  java
  • 【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;

    -- 

  • 相关阅读:
    案例(2)-- 线程不安全对象(SimpleDateFormat)
    案例(1)-- OOM异常
    jvm--工具
    死锁的产生以及定位死锁
    TCP--粘包拆包,netty的解决方式
    netty--处理器
    AtomicIntegerFieldUpdater和AtomicInteger
    NIO--ByteBuf
    Pipeline
    吴恩达机器学习笔记(四) —— BP神经网络
  • 原文地址:https://www.cnblogs.com/flydkPocketMagic/p/5998513.html
Copyright © 2011-2022 走看看