mysql外键(Foreign Key)介绍和创建外键的方法_Mysql

在MySQL中,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(无动作,默认的)

时间: 2024-10-31 10:43:26

mysql外键(Foreign Key)介绍和创建外键的方法_Mysql的相关文章

mysql实现合并同一ID对应多条数据的方法_Mysql

本文实例讲述了mysql实现合并同一ID对应多条数据的方法.分享给大家供大家参考,具体如下: 如 : CREATE TABLE `c_classuser_tab` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Classid` int(11) DEFAULT NULL, `Username` varchar(100) DEFAULT NULL, `studentid` varchar(100) DEFAULT NULL, `College` varchar(1

MYSQL每隔10分钟进行分组统计的实现方法_Mysql

前言 本文的内容主要是介绍了MYSQL每隔10分钟进行分组统计的实现方法,在画用户登录.操作情况在一天内的分布图时会非常有用,之前我只知道用「存储过程」实现的方法(虽然执行速度快,但真的是太不灵活了),后来学会了用高级点的「group by」方法来灵活实现类似功能. 正文: -- time_str '2016-11-20 04:31:11' -- date_str 20161120 select concat(left(date_format(time_str, '%y-%m-%d %h:%i'

MySQL中Union子句不支持order by的解决方法_Mysql

本文实例讲述了MySQL中Union子句不支持order by的解决方法.分享给大家供大家参考,具体如下: 我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此. 问题是这样的,我打算在一个表里获得与某一行记录相邻的两行,并且想通过union一起取出来,所以这么写: select id,title from subjects where id>#some_id# order by id limit 1 union select id,title from subjects

MySQL实现批量检查表并进行repair与optimize的方法_Mysql

本文实例讲述了MySQL实现批量检查表并进行repair与optimize的方法.分享给大家供大家参考,具体如下: 以下是shell的参考代码: #!/bin/bash host_name=192.168.0.123 user_name=xiaomo user_pwd=my_pwd database=my_db_name need_optmize_table=true tables=$(mysql -h$host_name -u$user_name -p$user_pwd $database -

mysql处理添加外键时提示error 150 问题的解决方法_Mysql

像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导. 在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系的问题, 更不幸的是它也并没有指明到底是哪一个问题会导致上面那种错误,下面我把导致这个可怕 的150错误的常见原因列出来了,并且我以可能性的大小作了排序 已知的原因: 1, 两个字

MySQL的主从复制步骤详解及常见错误解决方法_Mysql

 mysql主从复制(replication同步)现在企业用的比较多,也很成熟.它有以下优点: 1.降低主服务器压力,可在从库上执行查询工作. 2.在从库上进行备份,避免影响主服务器服务. 3.当主库出现问题时,可以切换到从库上. 不过,用它做备份时就会也有弊端,如果主库有误操作的话,从库也会收到命令.     下面直接进入操作.这里使用的是debian5操作系统,mysql5.0,默认引擎innodb      10.1.1.45 主库      10.1.1.43 从库 1.设置主库 1)修

mysql unique option prefix myisam_recover instead of myisam-recover-options的解决方法_Mysql

根据字面意思好像就是要把参数写全.在以后的版本中这种写法不支持了. 很多网上给的资料都是直接用 myisam_recover 就可以实现mysql数据库表的修复,但在新版本中需要加上参数才可以. 原来: 复制代码 代码如下: myisam_recover 现在: 复制代码 代码如下: myisam_recover_options=force,backup 自动修复MySQL的myisam表 常用MySQL的童鞋都知道这个myisam类型的表极容易损坏,多数人可能都是用myisamchk命令来人工

mysql中多表删除其中ID相同记录的方法_Mysql

  问题源自一个5年前的百度知道回答,刚看到这个问题时我刚上班21天,遂根据自己的那一丁点经验和临时操作检验做出了当时认为正确的回答:   但很快就被人否定,我猜主要原因就是我说的最后一句话过于绝对,但由于自己太相信自己了,而且有一大堆理由支撑着,所以没有深入研究. 最近又有网友评论了我的这个回答,我才开始查了一下百度,发现Mysql4.0以上版本已经可以通过一条delete删除多个表的数据了.看来我确实在误人子弟了,只能说声抱歉,好在楼主没有选我的答案,要不然罪过大了. 最后总结一下: MyS

mysql 加了 skip-name-resolve不能链接数据库问题的解决方法_Mysql

mysql 加了 skip-name-resolve不能链接的问题, 要确认 MySql 是否采用过主机名的授权 在 MySql Server 的配置文件 My.ini 中,增加如下两行: [mysqld] skip-name-resolve 它将禁止 MySql Server 对外部连接进行 DNS 解析,使用这一选项可以消除 MySql 进行 DNS 解析的时间. 但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求. 如果开启 ski