仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 947|回复: 7
打印 上一主题 下一主题

[学习教程] 发一篇Mysql开辟中的外键与参照完全性

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
DBaaS系统本身并不提供面对面访问或个人客户关系或持续不断的支持MySQL学习教程。这些就是需要解决方案提供商的原因。他们帮助客户选择正确的解决方案、规划集成和迁移战略,然后协助实施。参照完全性(Referentialintegrity)是数据库计划中一个主要的观点。在体系分歧的列表中,当数据库一切参照正当或非正当联系关系时城市触及到参照完全性。当参照完全性存在时,任何与不存在纪录的联系关系将变得有效化,由此可避免用户呈现各类毛病,从而供应更加正确和有用的数据库。
参照完全性一般经由过程外键(foreignkey)的利用而被普遍使用。久长以来,盛行工具开源RDBMSMySQL并没有撑持外键,缘故原由是这类撑持将会下降RDBMS的速率和功能。但是,因为良多用户对参照完全性的长处倍感乐趣,比来MySQL的分歧版本都经由过程新InnoDB列表引擎撑持外键。由此,在数据库构成的列表中坚持参照完全性将变得十分复杂。
为了创建两个MySQL表之间的一个外键干系,必需满意以下三种情形:
两个表必需是InnoDB表范例。
利用在外键干系的域必需为索引型(Index)。
利用在外键干系的域必需与数据范例类似。
例子是了解以上要点的最好办法。如表A所示,创建两个表,个中一个列出植物品种及响应的代码(表名为:species),另外一表列出植物园中的植物(表名为:zoo)。如今,我们想经由过程species联系关系这两个表,以是我们只必要承受和保留zoo表中包括species表中的正当植物的出口到数据库中。
表A
mysql>CREATETABLEspecies(idTINYINTNOTNULLAUTO_INCREMENT,nameVARCHAR(50)NOTNULL,PRIMARYKEY(id))ENGINE=INNODB;
QueryOK,0rowsaffected(0.11sec)
mysql>INSERTINTOspeciesVALUES(1,orangutan),(2,elephant),(3,hippopotamus),(4,yak);
QueryOK,4rowsaffected(0.06sec)
Records:4Duplicates:0Warnings:0
mysql>CREATETABLEzoo(idINT(4)NOTNULL,nameVARCHAR(50)NOTNULL,FK_speciesTINYINT(4)NOTNULL,INDEX(FK_species),FOREIGNKEY(FK_species)REFERENCESspecies(id),PRIMARYKEY(id))ENGINE=INNODB;
注重:关于非InnoDB表,FOREIGNKEY语句将被疏忽。
如今,fieldszoo.species与species.id之间存在一个外键干系。只要响应的zoo.specie与species.idfield的一个值相婚配,植物表中的出口才可被会见。以下的输入即演示了当你想输出一个HarryHippopotamus纪录,而利用到分歧法的species代码:
mysql>INSERTINTOzooVALUES(1,Harry,5);
ERROR1216(23000):Cannotaddorupdateachildrow:aforeignkeyconstraintfails
这里,MySQL核对species表以检察species代码是不是存在,假如发明不存在,就回绝该纪录。当你输出准确代码的,能够与以上做对照。
mysql>INSERTINTOzooVALUES(1,Harry,3);
QueryOK,1rowaffected(0.06sec)
这里,MySQL核对species表以检察species代码是不是存在,当发明存在,同意纪录保留在zoo表中。
为了删除一个外键干系,起首利用SHOWCREATETABLE找出InnoDB的外部标签,如表B所示:
表B
+-------+---------------------------------------------------+
|Table|CreateTable|
+-------+---------------------------------------------------+
|zoo|CREATETABLE`zoo`(
`id`int(4)NOTNULLdefault0,
`name`varchar(50)NOTNULLdefault,
`FK_species`tinyint(4)NOTNULLdefault0,
KEY`FK_species`(`FK_species`),
CONSTRAINT`zoo_ibfk_1`FOREIGNKEY(`FK_species`)
REFERENCES`species`(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=latin1|
+-------+----------------------------------------------------+
然后利用带有DROPFOREIGNKEY语句的ALTERTABLE命令,如以下:
mysql>ALTERTABLEzooDROPFOREIGNKEYzoo_ibfk_1;
QueryOK,1rowaffected(0.11sec)
Records:1Duplicates:0Warnings:0
为了将一个外键增加到一个现成的表中,利用ADDFOREIGNKEY的ALTERTABLE语句指定符合的域作为一个外键:
mysql>ALTERTABLEzooADDFOREIGNKEY(FK_species)REFERENCESspecies(id);
QueryOK,1rowsaffected(0.11sec)
Records:1Duplicates:0Warnings:0
如以上例子注释的,外键在捉摸数据出口毛病上起侧重要的感化,由此可创建更加健旺加倍集成的数据库。另外一方面值得提到的是,实行外键核实是外部材料处置的历程,且分歧表之间指定庞大的外部干系能够招致数据库的功能下落。以是,在参照完全性与功能思索之间找到均衡点相称主要,而利用外键就是可以确保功能与妥当之间的最优分离。
我希冀本期的有关外键的先容对你有所优点,你将会鄙人回的MySQL数据库计划中感觉到外键的优点。编程康乐!
列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序。MySQL学习教程这就如同我们经常争论的故事:先有鸡还是先有蛋?
再现理想 该用户已被删除
沙发
发表于 2015-1-18 05:42:53 | 只看该作者
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
柔情似水 该用户已被删除
板凳
发表于 2015-1-21 12:25:27 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
愤怒的大鸟 该用户已被删除
地板
发表于 2015-1-30 18:12:17 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-6 14:46:22 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
精灵巫婆 该用户已被删除
6#
发表于 2015-3-5 07:59:43 | 只看该作者
分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。
只想知道 该用户已被删除
7#
发表于 2015-3-12 01:58:32 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
不帅 该用户已被删除
8#
发表于 2015-3-19 17:35:53 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 04:10

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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