`

mysql外键入门介绍

阅读更多

FROM: http://www.cppblog.com/wolf/articles/69089.html

 

在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。
外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

搞个例子,简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:
建表:

 1 CREATE   TABLE  `dage` (
 2   `id`  int ( 11 NOT   NULL  auto_increment,
 3   `name`  varchar ( 32 default   '' ,
 4    PRIMARY   KEY   (`id`)
 5 ) ENGINE = InnoDB  DEFAULT  CHARSET = latin1;
 6
 7 CREATE   TABLE  `xiaodi` (
 8   `id`  int ( 11 NOT   NULL  auto_increment,
 9   `dage_id`  int ( 11 default   NULL ,
10   `name`  varchar ( 32 default   '' ,
11    PRIMARY   KEY   (`id`),
12    KEY  `dage_id` (`dage_id`),
13    CONSTRAINT  `xiaodi_ibfk_1`  FOREIGN   KEY  (`dage_id`)  REFERENCES  `dage` (`id`)
14 ) ENGINE = InnoDB  DEFAULT  CHARSET = latin1;

插入个大哥:
1 mysql >   insert   into  dage(name)  values ( ' 铜锣湾 ' );
2 Query OK,  1  row affected ( 0.01  sec)
3 mysql >   select   *   from  dage;
4 + -- --+--------+
5 |  id  |  name    |
6 + -- --+--------+
7 |    1   |  铜锣湾  |
8 + -- --+--------+
9 1  row  in   set  ( 0.00  sec)

插入个小弟:
1 mysql >   insert   into  xiaodi(dage_id,name)  values ( 1 , ' 铜锣湾_小弟A ' );
2 Query OK,  1  row affected ( 0.02  sec)
3
4 mysql >   select   *   from  xiaodi;
5 + -- --+---------+--------------+
6 |  id  |  dage_id  |  name          |
7 + -- --+---------+--------------+
8 |    1   |         1   |  铜锣湾_小弟A  |
9 + -- --+---------+--------------+

把大哥删除:
1 mysql >   delete   from  dage  where  id = 1 ;
2 ERROR  1451  ( 23000 ): Cannot  delete   or   update  a parent row: a  foreign   key   constraint  fails (`bstar / xiaodi`,  CONSTRAINT  `xiaodi_ibfk_1`  FOREIGN   KEY  (`dage_id`)  REFERENCES  `dage` (`id`))


提示:不行呀,有约束的,大哥下面还有小弟,可不能扔下我们不管呀!

插入一个新的小弟:

1 mysql >   insert   into  xiaodi(dage_id,name)  values ( 2 , ' 旺角_小弟A ' );              
2 ERROR  1452  ( 23000 ): Cannot  add   or   update  a child row: a  foreign   key   constraint  fails (`bstar / xiaodi`,  CONSTRAINT  `xiaodi_ibfk_1`  FOREIGN   KEY  (`dage_id`)  REFERENCES  `dage` (`id`))
3


提示:小子,想造反呀!你还没大哥呢!

把外键约束增加事件触发限制:

 1 mysql >  show  create   table  xiaodi;
 2
 3    CONSTRAINT  `xiaodi_ibfk_1`  FOREIGN   KEY  (`dage_id`)  REFERENCES  `dage` (`id`)
 4
 5 mysql >   alter   table  xiaodi  drop   foreign   key  xiaodi_ibfk_1; 
 6 Query OK,  1  row affected ( 0.04  sec)
 7 Records:  1   Duplicates:  0   Warnings: 
 8 mysql >   alter   table  xiaodi  add   foreign   key (dage_id)  references  dage(id)  on   delete   cascade   on   update   cascade ;
 9 Query OK,  1  row affected ( 0.04  sec)
10 Records:  1   Duplicates:  0   Warnings:  0

再次试着把大哥删了:
1 mysql >   delete   from  dage  where  id = 1 ;
2 Query OK,  1  row affected ( 0.01  sec)
3
4 mysql >   select   *   from  dage;
5 Empty  set  ( 0.01  sec)
6
7 mysql >   select   *   from  xiaodi;
8 Empty  set  ( 0.00  sec)



得,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade了呢!

例子说明的应该蛮清楚了吧,其他功能对应手册自己实践吧!:-)

分享到:
评论

相关推荐

    数据库新手入门之MySQL中如何定义外键

    本文介绍在在MySQL数据库中定义数据表、设置索引、定义外键、级联等操作。

    动力节点MySQL数据库入门视频教程-096-外键约束

    动力节点的杜老师讲述的mysql教程,详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如何安装MySQL及MySQL新特性,通过观看可掌握MySQL全套知识。

    MySQL 5.7 入门教程

    本教程涵盖了入门到进阶的内容,从连接数据库、创建数据库、建表讲起,到加载数据和简单的 SQL 查询,再到查看元数据,最后是更复杂的示例介绍,比如标量查询、自定义变量、使用外键、自增主键等。

    快速理解MySQL中主键与外键的实例教程

    主要介绍了MySQL中主键与外键的区别和联系,是MySQL入门学习中的基础知识,需要的朋友可以参考下

    mysql基础入门课程

    02. 基础-概述-MySQL安装及启动 03. 基础-SQL-通用语法及分类 04. 基础-SQL-DDL-数据库操作 05. 基础-SQL-DDL-表操作-创建&查询 06. 基础-SQL-DDL-数据类型及案例 07. 基础-SQL-DDL-表操作-修改&删除 08. 基础-SQL-...

    详解MySQL从入门到放弃-安装

    外键 4.MySQL数据库管理系统 数据库 数据表 视图 存储过程 软件安装 MySQL下载链接:MySQL   下载第一个,之后解压缩。 我的目录在C:\Users\Public\MySQL,之后在该文件夹配置my.ini 接下来启动MySQL,在cmd...

    MySQL使用入门

    文章目录MySQLDDL: CRUD数据库的CRUD创建查询修改删除使用数据库数据库表的CURD创建查询修改删除DML: 增删表中数据添加数据删除数据修改数据DQL: 查询表中的记录基础查询条件查询排序查询聚合函数分组查询分页查询...

    MySQL高级.zip

    查询中与其他表关联的字段,外键关系建立索引 频繁更新的字段不适合创建索引 -- 因为每次更新不单单是更新了记录还会更新索引 Where条件里用不到的字段不创建索引 单键/组合索引的选择问题,who?(在高并发下倾向...

    MySQL入门到精通

    掌握各种数据库约束:主键/非空/**/默认值/外键约束/零填充/自增长等 掌握表与表的关系:一对一/一对多/多对多 掌握表关系的建表原则 掌握多表查询的方式:内连接/外连接/全连接/子查询等 掌握数据库的三大范式 掌握...

    MySQL 5权威指南(第3版) 中文版 下载地址

    本书全面深入地介绍了MySQL的功能,主要内容包括MySQL、PHP、Apache、Perl等组件的安装与功能简介,mysql等一些重要系统管理工具和用户操作界面的使用,MySQL数据库系统设计的基础知识与用不同语言设计MySQL数据库的...

    Mysql入门基础整理(一)如何创建新用户并增添改查与外键使用

    进入:mysql -u 用户名 -p 用户密码 修改密码:mysqladmin -u用户名 -p旧密码 password 新密码 基本 如何添加新用户 创建用户 create user ‘用户名’@’ip’identified by ‘密码’ 删除用户: drop user ‘用户名...

    PHP和MySQL Web应用开发核心技术 源码

    ·对数据访问详细讨论,包含事务处理、外键和索引。 ·利用PHP正则表达式的功能强大的数据验证技术。 ·介绍计划Web应用程序,包括用户界面和用户管理。 ·提供关于保证Web应用程序安全性的系统化指南。 ·涵盖广泛...

    Mysql总结.png

    该脑图专为入门学习mysql的小伙伴所准备的,包含【安装步骤、启动连接、数据库常常用的基本命令[查库、建库、删库、建表、删表]、数据库表详细的增删查改语句以及事例、表的基本操作、索引操作、外键约束、表关联、...

    SQL入门之样例表脚本(MySQL (and MariaDB) SQL scripts).zip

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    MySQL5 权威指南第3版中文版_part1

    本书全面深入地介绍了MySQL的功能,主要内容包括MySQL、PHP、Apache、Perl等组件的安装与功能简介,mysql等一些重要系统管理工具和用户操作界面的使用,MySQL数据库系统设计的基础知识与用不同语言设计MySQL数据库的...

    PHP和MySQL Web开发第4版pdf以及源码

    9.5 MySQL权限系统的介绍 9.5.1 最少权限原则 9.5.2 创建用户:GRANT命令 9.5.3 权限的类型和级别 9.5.4 REVOKE命令 9.5.5 使用GRANT和REVOKE的例子 9.6 创建一个Web用户 9.7 使用正确的数据库 9.8 创建...

    数据库管理员从入门到精通视频教程.zip

    1.01.mysql安装视频 1.02.初识数据库1 1.03.初识数据库2 1.04.初识数据库3 1.05.初识数据库4 2.01.mysql数据库建表 2.02.mysql数据库建表和修改表结构 2.03.navicat安装和使用 2.04.作业和复习 2.05.随堂练习 2.06....

    PHP和MySQL WEB开发(第4版)

    9.5 MySQL权限系统的介绍 9.5.1 最少权限原则 9.5.2 创建用户:GRANT命令 9.5.3 权限的类型和级别 9.5.4 REVOKE命令 9.5.5 使用GRANT和REVOKE的例子 9.6 创建一个Web用户 9.7 使用正确的数据库 9.8 创建数据库表 ...

    Mysql入门基础 数据库创建篇

    #正统的创建方式,具体的参数,请参考mysql手册,在这里不做详细的解释,只说一些比较特别的。 例: 代码如下: create table user(id int unsigned not null auto_increment, username char(15), sex enum(‘M’,’F...

Global site tag (gtag.js) - Google Analytics