仓酷云

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

[学习教程] MYSQL编程:完成删除主表数据时, 判别与之联系关系的外...

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

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

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

x
据我的观察,现在有一个趋势,那些经过正式培训的数据库管理员DBA更倾向于选择一个专有关系数据库,例如Oracle。对于一些具有专门数据库管理员的比较大的环境来说,MySQL很难得到宠爱,这时候,关于MySQL是否真的具有良好的可扩展性的争论已经没有意义。成绩形貌:某个基本信息表,与体系中30多个表存在外键干系,当删除基本数据时,必要判别是不是已被用过,假如用过则变动标记位,假如没有效过则间接删除,怎样能很好完成这个处置?最好可以主动顺应表的变更成绩办理(SQLServer2005--SQLServer2005的毛病处置简单把持,因而,SQLServer2005中能够间接删除,经由过程毛病处置来断定是不是必要更新.--示比方下.USEtempdbGOCREATETABLEm(idintPRIMARYKEY,bzbit)INSERTmSELECT1,0UNIONALLSELECT2,0CREATETABLEc(idintprimarykey,a_idintreferencesm(id)ONDELETENOACTION)INSERTcSELECT1,1GO--删除处置存储历程CREATEPROCdbo.p_delete@idintASSETNOCOUNTONBEGINTRYBEGINTRANDELETEFROMmWHEREid=@idCOMMITTRANENDTRYBEGINCATCHROLLBACKTRANIFERROR_NUMBER()=547--假如是外键束缚毛病BEGINBEGINTRYBEGINTRAN--更新标记UPDATEmSETbz=1WHEREid=@idCOMMITTRANENDTRYBEGINCATCHSELECTERROR_NUMBER(),ERROR_MESSAGE()ENDCATCHENDELSESELECTERROR_NUMBER(),ERROR_MESSAGE()ENDCATCHGO--挪用EXECdbo.p_delete1EXECdbo.p_delete2SELECT*FROMmSELECT*FROMcGODROPTABLEc,mDROPPROCdbo.p_delete成绩办理(SQLServer2000--SQLServer2000对毛病处置欠好把持,一样平常仍是倡议做判别--经由过程体系表查询体系表,能够猎取某个表联系关系的一切外键表--示例存储历程CREATEPROCdbo.p_Delete@tbnamesysname,--基本数据表名@PkFieldNamesysname,--基本数据表关头字段名@PkValueint--要删除的基本数据表关头字值ASSETNOCOUNTONDECLARE@bzbit,@snvarchar(4000)DECLAREtbCURSORLOCALFORSELECTNSET@bz=CASEWHENEXISTS(SELECT*FROM+QUOTENAME(@tbname)+NA,+QUOTENAME(OBJECT_NAME(B.fkeyid))+NBWHEREA.+QUOTENAME((SELECTnameFROMsyscolumnsWHEREcolid=B.rkeyANDid=B.rkeyid))+N=B.+QUOTENAME((SELECTnameFROMsyscolumnsWHEREcolid=B.fkeyANDid=B.fkeyid))+NANDA.+QUOTENAME((SELECTnameFROMsyscolumnsWHEREcolid=B.rkeyANDid=B.rkeyid))+N=@id)THEN1ELSE0ENDFROMsysobjectsAJOINsysforeignkeysBONA.id=B.constidJOINsysobjectsCONA.parent_obj=C.idWHEREA.xtype=fANDC.xtype=UANDOBJECT_NAME(B.rkeyid)=@tbnameOPENtbFETCHtbINTO@sWHILE@@FETCH_STATUS=0BEGINEXECsp_executesql@s,N@tbnamesysname,@idint,@bzbitOUT,@tbname,@PkValue,@bzOUTIF@bz=1BEGINSET@s=NUPDATE+QUOTENAME(@tbname)+NSETbz=1WHERE+QUOTENAME(@PkFieldName)+N=@idEXECsp_executesql@s,N@idint,@PkValueRETURNENDFETCHtbINTO@sENDCLOSEtbDEALLOCATEtbSET@s=NDELETEFROM+QUOTENAME(@tbname)+NWHERE+QUOTENAME(@PkFieldName)+N=@idEXECsp_executesql@s,N@idint,@PkValueGO注重事项设置表的主/外键干系的时分,不要设置级联删除(ONDELETECASCADE)

一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。
乐观 该用户已被删除
沙发
发表于 2015-1-19 08:42:23 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
admin 该用户已被删除
板凳
发表于 2015-1-24 14:19:35 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
透明 该用户已被删除
地板
发表于 2015-2-1 16:52:11 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
海妖 该用户已被删除
5#
发表于 2015-2-7 10:07:31 | 只看该作者
原来公司用过MYSQL自己也只是建个表写个SQL
分手快乐 该用户已被删除
6#
发表于 2015-2-21 17:40:54 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
山那边是海 该用户已被删除
7#
发表于 2015-3-6 20:59:25 | 只看该作者
我们学到了什么?思考问题的时候从表的角度来思考问
第二个灵魂 该用户已被删除
8#
发表于 2015-3-13 09:10:05 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-20 18:53:03 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 06:59

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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