设为首页 收藏本站
查看: 694|回复: 0

[经验分享] MySQL外键 Cannot add or update a child row错误的实例解释

[复制链接]

尚未签到

发表于 2016-10-19 10:07:18 | 显示全部楼层 |阅读模式
  在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(跟随外键改动)c
SET NULL(设空值)
SET DEFAULT(设默认值)
NOACTION(无动作,默认的)
  搞个例子,简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:
建表:
1 DSC0000.gif CREATETABLE`dage`(
2`id`int(11)NOTNULLauto_increment,
3`name`varchar(32)default'',
4PRIMARYKEY(`id`)
5)ENGINE=InnoDBDEFAULTCHARSET=latin1;
6
7CREATETABLE`xiaodi`(
8`id`int(11)NOTNULLauto_increment,
9`dage_id`int(11)defaultNULL,
10`name`varchar(32)default'',
11PRIMARYKEY(`id`),
12KEY`dage_id`(`dage_id`),
13CONSTRAINT`xiaodi_ibfk_1`FOREIGNKEY(`dage_id`)REFERENCES`dage`(`id`)
14)ENGINE=InnoDBDEFAULTCHARSET=latin1;

插入个大哥:
1mysql>insertintodage(name)values('铜锣湾');
2QueryOK,1rowaffected(0.01sec)
3mysql>select*fromdage;
4+----+--------+
5|id|name|
6+----+--------+
7|1|铜锣湾|
8+----+--------+
91rowinset(0.00sec)

插入个小弟:
1mysql>insertintoxiaodi(dage_id,name)values(1,'铜锣湾_小弟A');
2QueryOK,1rowaffected(0.02sec)
3
4mysql>select*fromxiaodi;
5+----+---------+--------------+
6|id|dage_id|name|
7+----+---------+--------------+
8|1|1|铜锣湾_小弟A|
9+----+---------+--------------+

把大哥删除:
1mysql>deletefromdagewhereid=1;
2ERROR1451(23000):Cannotdeleteorupdateaparentrow:aforeignkeyconstraintfails(`bstar/xiaodi`,CONSTRAINT`xiaodi_ibfk_1`FOREIGNKEY(`dage_id`)REFERENCES`dage`(`id`))
  
提示:不行呀,有约束的,大哥下面还有小弟,可不能扔下我们不管呀!
  插入一个新的小弟:
1mysql>insertintoxiaodi(dage_id,name)values(2,'旺角_小弟A');
2ERROR1452(23000):Cannotaddorupdateachildrow:aforeignkeyconstraintfails(`bstar/xiaodi`,CONSTRAINT`xiaodi_ibfk_1`FOREIGNKEY(`dage_id`)REFERENCES`dage`(`id`))
3
  
提示:小子,想造反呀!你还没大哥呢!
  把外键约束增加事件触发限制:
1mysql>showcreatetablexiaodi;
2 DSC0001.gif
3CONSTRAINT`xiaodi_ibfk_1`FOREIGNKEY(`dage_id`)REFERENCES`dage`(`id`)
4
5mysql>altertablexiaodidropforeignkeyxiaodi_ibfk_1;
6QueryOK,1rowaffected(0.04sec)
7Records:1Duplicates:0Warnings:
8mysql>altertablexiaodiaddforeignkey(dage_id)referencesdage(id)ondeletecascadeonupdatecascade;
9QueryOK,1rowaffected(0.04sec)
10Records:1Duplicates:0Warnings:0

再次试着把大哥删了:
1mysql>deletefromdagewhereid=1;
2QueryOK,1rowaffected(0.01sec)
3
4mysql>select*fromdage;
5Emptyset(0.01sec)
6
7mysql>select*fromxiaodi;
8Emptyset(0.00sec)
  

得,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade了呢!
  例子说明的应该蛮清楚了吧,其他功能对应手册自己实践吧!:-)
  
  
  转自: http://www.cppblog.com/wolf/articles/69089.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288327-1-1.html 上篇帖子: MySQL数据库对dvbbs.php全文搜索的完全分析 下篇帖子: MySQL java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x90
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表