-- 创建测试主表. ID 是主键.
CREATE TABLE test_main (
  id      INT,
  value   VARCHAR(10),
  PRIMARY KEY(id)
);

-- 创建测试子表.
CREATE TABLE test_sub (
  id      INT,
  main_id INT,
  value   VARCHAR(10),
  PRIMARY KEY(id)
);

-- 插入测试主表数据.
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');

-- 插入测试子表数据.
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');

默认外键约束方式
mysql> ALTER TABLE test_sub
    ->   ADD CONSTRAINT main_id_cons
    ->   FOREIGN KEY (main_id)
    ->   REFERENCES  test_main(id);
    -> //
Query OK, 2 rows affected (0.17 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> DELETE FROM
    ->   test_main
    -> WHERE
    ->   id = 1;
    -> //
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constrai
nt fails (`test`.`test_sub`, CONSTRAINT `main_id_cons` FOREIGN KEY (`main_id`) R
EFERENCES `test_main` (`id`))

MySQL使用下面这个语句删除外键约束
ALTER TABLE test_sub DROP FOREIGN KEY  main_id_cons;

DELETE CASCADE 方式
mysql> ALTER TABLE test_sub
    ->   ADD CONSTRAINT main_id_cons
    ->   FOREIGN KEY (main_id)
    ->   REFERENCES  test_main(id)
    ->   ON DELETE CASCADE//
Query OK, 2 rows affected (0.16 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> DELETE FROM
    ->   test_main
    -> WHERE
    ->   id = 1;
    -> //
Query OK, 1 row affected (0.02 sec)

mysql> SELECT
    ->   *
    -> FROM
    ->   test_sub;
    -> //
+----+---------+--------+
| id | main_id | value  |
+----+---------+--------+
|  2 |       2 | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)

MySQL使用下面这个语句删除外键约束
ALTER TABLE test_sub DROP FOREIGN KEY  main_id_cons;

UPDATE CASCADE方式
mysql> ALTER TABLE test_sub
    ->   ADD CONSTRAINT main_id_cons
    ->   FOREIGN KEY (main_id)
    ->   REFERENCES  test_main(id)
    ->   ON UPDATE CASCADE;
    -> //
Query OK, 1 row affected (0.14 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> UPDATE test_main SET id = 5 where id = 2
    -> //
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test_sub//
+----+---------+--------+
| id | main_id | value  |
+----+---------+--------+
|  2 |       5 | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)

MySQL使用下面这个语句删除外键约束
ALTER TABLE test_sub DROP FOREIGN KEY  main_id_cons;

SET NULL方式
mysql> ALTER TABLE test_sub
    ->   ADD CONSTRAINT main_id_cons
    ->   FOREIGN KEY (main_id)
    ->   REFERENCES  test_main(id)
    ->   ON DELETE SET NULL;
    -> //
Query OK, 1 row affected (0.13 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> DELETE FROM
    ->   test_main
    -> WHERE
    ->   id = 5;
    -> //
Query OK, 1 row affected (0.05 sec)

mysql>
mysql> SELECT
    ->   *
    -> FROM
    ->   test_sub;
    -> //
+----+---------+--------+
| id | main_id | value  |
+----+---------+--------+
|  2 |    NULL | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)

mysql 外键约束示例的更多相关文章

  1. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  2. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  3. mysql外键约束总结

    总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...

  4. MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

    MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: ALTER TABLE tbl_name ADD [CON ...

  5. Mysql外键约束设置使用方法

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...

  6. mysql 外键约束

    外键的定义语法:[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)    REFERENCES tbl_name (index_col ...

  7. MYSQL外键约束的参照操作

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...

  8. 1、Mysql无法创建外键的原因 2、MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  9. MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE

    MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键. 外键约束条件有以下4种: (1)restrict ...

随机推荐

  1. Java如何从数组中查找对象元素?

    在Java中,如何从数组中查找对象元素? 示例 以下示例使用Contains方法来搜索数组中的String对象. package com.yiibai; import java.util.*; pub ...

  2. 微软office web apps 服务器搭建之在线文档预览

    案例:http://owa.linbsoft.com/op/generate.aspx# 文档地址:http://demo.linbsoft.com/CourseFile/201407/2014070 ...

  3. Eclipse的SVN插件移动中文名称文件提示org.tigris.subversion.javahl.ClientException: Bogus URL

    今天一个同事使用Eclipse的SVN插件,在"SVN资源库"视图,移动一个中文名称的文件,提示org.tigris.subversion.javahl.ClientExcepti ...

  4. LigerUI树节点选中之后节点背景太短

    LigerUI树节点选中之后的效果如下: 可以看出,节点的背景太短,不能适应树的宽度 理想的效果应该是节点选中之后,节点背景和树的宽度一样 虽然没有找到官方的解决办法 但是,通过查询LigerUI的A ...

  5. Linux 用户与用户组管理

    Linux 是一个多用户多任务的分是操作系统,用户是实现操作系统资源分配,同时也是安全权限模型的核 心要素之一:用户组是一个容纳很多用户的容器,可以分配权限组,进一步优化了权限分配. 一.用户管理 用 ...

  6. C# 获取文件夹下的所有文件的文件名

    String path = @"X:\xxx\xxx"; //第一种方法 var files = Directory.GetFiles(path, "*.txt" ...

  7. Enhance基本例子

    太晚了,有些东西没有补充,回头再补上. 先上Demo 1.要执行的方法 package enhancerTest; /** * Created by LiuSuSu on 2017/3/26. */ ...

  8. Thinkphp部署

    环境nginx,apache,iis naginx环境需要: apache需要: iis需要: 项目入口 1.根目录("/") 2.多级目目录(“/public”) 静态文件 静态 ...

  9. SharePoint 2013 处理videoplayerpage.aspx下的个人图片显示有误问题

    问题: Personal site's photo can't correct display in the videos page The url address of personal site' ...

  10. 彻底搞清楚Java并发 (一) 基础

    多线程编程是为了让程序运行得更快,但是不是说,线程创建地越多越好,线程切换的时候上下文切换,以及受限于硬件和软件资源的限制问题 上下文切换 单核CPU同样支持多线程编程,CPU通过给每个线程分配CPU ...