外键在主表中不存在数据库外键约束,请问如何处理

Mysql中增加与取消外键约束语句-mysql教程-数据库-壹聚教程网Mysql中增加与取消外键约束语句MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下:
[CONSTRAINT [symbol]] FOREIGN KEY
&&& [index_name] (index_col_name, ...)
&&& REFERENCES tbl_name (index_col_name,...)
&&& [ON DELETE reference_option]
&&& [ON UPDATE reference_option]
reference_option:
&&& RESTRICT | CASCADE | SET NULL | NO ACTION& 外键的使用需要满足下列的条件:
& 1. 两张表必须都是InnoDB表,并且它们没有临时表。
& 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
& 3. 建立外键关系的对应列必须建立了索引。
& 4. 假如显式的给出了CONSTRAINT symbol,那symbol在中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。
& 如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:
& 1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
& 2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
& 3. NO ACTION: InnoDB拒绝删除或者更新父表。
& 4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
& 5. SET DEFAULT: InnoDB目前不支持。
& 外键约束使用最多的两种情况无外乎:
& 1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;
& 2)父表更新时子表也更新,父表删除时子表匹配的项也删除。
& 前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。
& InnoDB允许你使用ALTER TABLE在一个已经存在的表上增加一个新的外键:
ALTER TABLE tbl_name
&&& ADD [CONSTRAINT [symbol]] FOREIGN KEY
&&& [index_name] (index_col_name, ...)
&&& REFERENCES tbl_name (index_col_name,...)
&&& [ON DELETE reference_option]
&&& [ON UPDATE reference_option]
& InnoDB也支持使用ALTER TABLE来删除外键:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_
若要设置外键,在参照表(referencing table,即Pc表) 和被参照表 (referenced table,即parts表) 中,相对应的两个字段必须都设置索引(index)。
对Parts表:
ALTER TABLE parts ADD INDEX idx_model (model);
这句话的意思是,为 parts 表增加一个索引,索引建立在 model 字段上,给这个索引起个名字叫idx_model。
对Pc表也类似:
ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);
事实上这两个索引可以在创建表的时候就设置。这里只是为了突出其必要性。
下面为两张表之间建立前面所述的那种&约束&。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将Pc表的cpumodel字段设置为&外键&(FOREIGN KEY),即这个键的参照值来自于其他表。
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
第一行是说要为Pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于Parts表的model字段。
这样,我们的外键就可以了。如果我们试着CREATE一台Pc,它所使用的CPU的型号是Parts表中不存在的,那么MySQL会禁止这台PC被CREATE出来。
考虑以下这种情况:
技术人员发现,一个月之前输入到 parts 表中的某个系列的 cpu (可能有很多款)的型号全都输错了一个字母,现在需要改正。我们希望的是,当 parts 表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。
可以在定义外键的时候,在最后加入这样的关键字:
ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫&级联&操作。:)
如果把这语句完整的写出来,就是:
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON UPDATE CASCADE;
除了 CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作。
Mysql中取消外键约束。 .
SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束。
上一页: &&&&&下一页:相关内容编辑推荐如何删除Sqlserver数据库中存在主外键关联的两个表的数据行
[问题点数:40分,结帖人ManJunhong]
如何删除Sqlserver数据库中存在主外键关联的两个表的数据行
[问题点数:40分,结帖人ManJunhong]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。地区:萍乡
头衔:项目副经理
悬赏分:30
浏览数:2251
[向专家提问] 
打开工程失败,字段值【1】在其主表中不存在,
怎么解决啊
打开工程失败,字段值【1】在其主表中不存在,
怎么解决啊
请填写消息,提交后将发送给用户
及时采纳答案不仅是对回答者的认可,同时也能避免问题过期后被
地区:山东
等级:13 级
头衔:集团总裁
打开工程显示[profo]表外键字段【AseismicGrade]的字段值【1】在其主表中不存在是啥意思
答:你好:版本低了换新版本打开,升级下你的软件。
地区:陕西
等级:16 级
头衔:全球总裁
对照图片看看问题出在哪一个环节上,如果全部符合,就找广联达处理一下,有售后保障的。
地区:陕西
等级:9 级
头衔:副总
原因分析:工程是用较新版本1146做的或者用1146版本打开过,再使用比1146低的版本打开时就会有相应的提示,本应提示为:【这是一个版本号为12.3.0.1146的新版本,请使用新版软件打开】,但因为目前1146版本数据库升级的问题,就有提示此报错。
解决方案:安装12.3.0.1146及以上的版本即可。
操作执行中...
cookies_UIN:,Questionstate:0
您不能进行回复操作。因为您还没有在服务新干线系统!
如果您没有注册,请点击这里
无满意答案
  及时举报违规行为,共同维护良好环境
举报原因:
问题与专业无关
没有实用价值
问题描述不清晰
同IP自问自答,恶意刷分
完全复制他人答案
部分复制他人答案
无实际价值
同IP自问自答,恶意刷分
    
如果您认为这个答案有误,或者有更好的答案,请立即告诉我们!
如果您的“揪”错被采纳,可获得10分积分奖励!
我的答疑任务
图片正在上传...}

我要回帖

更多关于 数据库外键怎么设置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信