MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2325|回复: 4
打印 上一主题 下一主题

子表外键级联失效

[复制链接]
跳转到指定楼层
1#
发表于 2014-10-24 11:32:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用下面的语句创建了两个表:

  1. create table Klass
  2. (
  3.    KNo                  varchar(10) not null,
  4.    Sno                  varchar(10),
  5.    KName                varchar(50),
  6.    primary key (KNo)
  7. );

  8. create table Student
  9. (
  10.    Sno                  varchar(10) not null,
  11.    SName                varchar(10),
  12.    primary key (Sno)
  13. );

  14. alter table Klass add constraint FK_Relationship_1 foreign key (Sno)
  15.       references Student (Sno) on delete restrict on update restrict;
复制代码

然后,用下面语句在两个表中分别插入一行,再将子表Klass的外键更新约束改为CASCADE方式,最后用update语句尝试更新主表Student的主键为'S002'。
  1. insert into Student(Sno, SName)
  2. values('S001', 'Tom');

  3. insert into Klass(KNo, Sno, KName)
  4. values('K001', 'S001', 'JingRong');

  5. alter table Klass
  6. add constraint foreign key(Sno) references Student(Sno)
  7. on update cascade;

  8. update Student
  9. set Sno = 'S002';
复制代码


按我的理解,此时子表行的外键取值应该一同更改为'S002',但得到一个错误提示。



向大家请教,是否MySQL对外键级联方式处理是否有不同的定义。谢谢!

001.jpg (75.85 KB, 下载次数: 18)

001.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
推荐
 楼主| 发表于 2014-10-24 11:40:33 | 只看该作者
忘记说明我用的MySQL版本时5.5的。

刚才又尝试了一下外键约束的SET NULL方式,却可以正常更新。
  1. alter table Klass
  2. add constraint foreign key(Sno) references Student(Sno)
  3. on update set null;

  4. update Student
  5. set Sno = 'S002';
复制代码



002.jpg (56.21 KB, 下载次数: 14)

002.jpg
3#
发表于 2014-10-24 17:55:16 | 只看该作者
首先表扬你帖子提的清楚明了。
其次赞美你这个不断做实验的实事求是的态度!{:soso_e179:}

4#
 楼主| 发表于 2014-10-25 02:38:55 | 只看该作者
问题找到了,在一个表上对同一个外键增加了两个外键约束,这会产生歧义。今后应该坚持对每个外键只加一个约束。如果需要对该外键更改约束,应该先drop,再add。

点评

有头有尾,有总结,赞。  发表于 2014-10-28 15:23
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-4 10:24 , Processed in 0.074042 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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