|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQLAB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。
比来在做假材料时常常必要删除一些表中的内容。可是:
设置外键后,想删除表中的数据没法删除,这时候需删除外键后重修,
或找到外键后用altertable表名nocheck外键名 来临时屏障外键,然后删除。
爽性写个存储历程,设置外键的开关。
execfk_switch表名,0屏障外键
execfk_switch表名,1重启外键
/*Usage:
execfk_switchtableName,0
deletetableNamewherefieldName=abc
--truncatetabletableName
execfk_switchtableName,1
*/
Createprocfk_switch@tableNamevarchar(20),@statusbit
As
declare@fkvarchar(50),@fktablevarchar(20)
declare@svarchar(1000)
declarecurcursorfor
selectb.nameasfkname,c.nameasfktablename
fromsysforeignkeysa
joinsysobjectsbona.constid=b.id
joinsysobjectscona.fkeyid=c.id
joinsysobjectsdona.rkeyid=d.id
whered.name=@tableName
opencur
fetchnextfromcurinto@fk,@fktable
while@@fetch_status=0
begin
if@status=0
begin
set@s=altertable+@fktable+nocheckconstraint+@fk
print@s
end
else
begin
set@s=altertable+@fktable+checkconstraint+@fk
print@s
end
exec(@s)
fetchnextfromcurinto@fk,@fktable
end
closecur
deallocatecur
go
--以下为测试:
createtableA(idintprimarykey)
go
createtableB(idint,
constraintfk_B_Aforeignkey(id)referencesA(id))
go
createtableC(idint,
constraintfk_C_Aforeignkey(id)referencesA(id))
go
insertAvalues(1)
insertBvalues(1)
insertCvalues(1)
--1:
deletea
/*****
服务器:动静547,级别16,形态1,行1
DELETEstatementconflictedwithCOLUMNREFERENCEconstraintfk_B_A.Theconflictoccurredindatabasepubs,tableB,columnid.
Thestatementhasbeenterminated.
*******/
--2:
begintran
execfk_switchA,0
deleteA
execfk_switchA,1
rollback
/*
altertableBnocheckconstraintfk_B_A
altertableCnocheckconstraintfk_C_A
(所影响的行数为1行)
altertableBcheckconstraintfk_B_A
altertableCcheckconstraintfk_C_A
*/
--3:扫除测试表
droptableA,B,C
go
在ORDERBY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快ORDERBY方面也没什么作用)。 |
|