仓酷云
标题: MYSQL网站制作之MySQL数据库开辟中的外键与参照完全性 [打印本页]
作者: 谁可相欹 时间: 2015-1-16 22:45
标题: MYSQL网站制作之MySQL数据库开辟中的外键与参照完全性
一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。mysql|数据|数据库参照完全性(Referentialintegrity)是数据库计划中一个主要的观点。在体系分歧的列表中,当数据库一切参照正当或非正当联系关系时城市触及到参照完全性。当参照完全性存在时,任何与不存在纪录的联系关系将变得有效化,由此可避免用户呈现各类毛病,从而供应更加正确和有用的数据库。 参照完全性一般经由过程外键(foreignkey)的利用而被普遍使用。久长以来,盛行工具开源RDBMSMySQL并没有撑持外键,缘故原由是这类撑持将会下降RDBMS的速率和功能。但是,因为良多用户对参照完全性的长处倍感乐趣,比来MySQL的分歧版本都经由过程新InnoDB列表引擎撑持外键。由此,在数据库构成的列表中坚持参照完全性将变得十分复杂。
<Palign=left> 为了创建两个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:0mysql>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数据库计划中感觉到外键的优点。编程康乐!
事实上,在任何DBaaS中,解决方案提供商对如何管理物理资源都没有控制权,因此MySQL学习教程可能会发现由于DBaaS的局限性使得他们提供给客户的远远小于客户所期望的。
作者: 莫相离 时间: 2015-1-19 22:48
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
作者: 小女巫 时间: 2015-1-25 21:53
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
作者: 只想知道 时间: 2015-2-4 05:58
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
作者: 再现理想 时间: 2015-2-9 16:29
所以你总能得到相应的升级版本,来满足你的需求。
作者: 深爱那片海 时间: 2015-2-27 10:51
连做梦都在想页面结构是怎么样的,绝非虚言
作者: 谁可相欹 时间: 2015-3-9 01:26
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
作者: 小妖女 时间: 2015-3-16 19:41
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
作者: 活着的死人 时间: 2015-3-23 00:14
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
欢迎光临 仓酷云 (http://ckuyun.com/) |
Powered by Discuz! X3.2 |