|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Mysql的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。server|sqlserver|数据
--定位数据
--计划思绪:
--保留要被挪动纪录的原主键值和新主键值(假如有主键的话),然后对照两个主键值的巨细(纪录信息按升序分列),
--假如原主键值年夜,标明该纪录被挪动到后面的新地位,可将原地位的纪录信息保留上去,并将重新地位的纪录信息到
--原纪录的前一笔记录的信息依次往下挪动,把保留的原纪录挪动到新地位便可。
--假如原主键值小,标明该纪录被挪动到前面的新地位,可将原地位的纪录信息保留上去,并将重新地位的纪录信息到
--原纪录的下一笔记录的信息依次往上挪动,把保留的原纪录挪动到新地位便可。实践上就是纪录块的挪动.
--可是,假如数据表中的数据十分复杂,该存储历程的实行效力将会下落.
Usezzydb
--创立举例表(先生信息表)
CreateTableT_StudentsInfo
(i_idintidentity(1,1),--体系自增流水号
c_Stu_IDnvarchar(10),--学号
c_ClassNamenvarchar(50),--班级
d_BirthDaydatetime)--出身日期
go
--向举例表中拔出4条先生信息,以考证上面的存储历程(sp_MyAdjustRecordOrder)
InsertintoT_StudentsInfovalues(001,年夜二三班,1978-01-25)
InsertintoT_StudentsInfovalues(002,年夜一六班,1979-02-05)
InsertintoT_StudentsInfovalues(003,年夜四三班,1981-07-15)
InsertintoT_StudentsInfovalues(004,年夜三一班,1976-01-05)
select*fromT_StudentsInfo
ifobject_id(sp_MyAdjustRecordOrder)0
dropprocsp_MyAdjustRecordOrder
go
CreateProcsp_MyAdjustRecordOrder(@OldStuIdnvarchar(10),@NewStuIdnvarchar(10))
as
--@OldStuid先生学号(用以暗示被挪动的纪录),
--@NewStuid先生学号(用以暗示将被挪动的纪录拔出的新地位)
begin
declare@Old_i_idint,@New_i_idint
declare@i_BlockCountint--行将被挪动的纪录块条数
declare@iint--轮回变量
--取得id值
Select@Old_i_id=(selectI_idfromT_StudentsInfowherec_Stu_ID=@OldStuId)
Select@New_i_id=(selectI_idfromT_StudentsInfowherec_Stu_ID=@NewStuId)
select@i_BlockCount=abs(@Old_i_id-@New_i_id)
--保留被挪动的先生信息
Selectc_Stu_ID,c_ClassName,d_BirthDay
intoNew_StudentsInfo--一时创立的表,用完后删除
fromT_StudentsInfo
wherec_Stu_ID=@OldStuId
if@New_i_id<@Old_i_id--将原纪录信息挪动到了后面
begin
select@i=0
while@i<=@i_BlockCount-1
begin
updateT_StudentsInfo
setc_Stu_ID=T2.c_Stu_ID,
c_ClassName=T2.c_ClassName,
d_BirthDay=T2.d_BirthDay
FromT_StudentsInfo,T_StudentsInfoT2
where(T_StudentsInfo.i_id=@Old_i_id-@i)and
(T2.i_id=@Old_i_id-@i-1)
select@i=@i+1
end
end
if@New_i_id>@Old_i_id--将原纪录信息挪动到了前面
begin
select@i=0
while@i<=@i_BlockCount-1
begin
updateT_StudentsInfo
setc_Stu_ID=T2.c_Stu_ID,
c_ClassName=T2.c_ClassName,
d_BirthDay=T2.d_BirthDay
FromT_StudentsInfo,T_StudentsInfoT2
where(T_StudentsInfo.i_id=@Old_i_id+@i)and
(T2.i_id=@Old_i_id+@i+1)
select@i=@i+1
end
end
updateT_StudentsInfo
setc_Stu_ID=T3.c_Stu_ID,
c_ClassName=T3.c_ClassName,
d_BirthDay=T3.d_BirthDay
FromT_StudentsInfoT1,New_StudentsInfoT3
where(T1.i_id=@New_i_id)
DroptableNew_StudentsInfo
--if@New_i_id=@Old_i_id--地位未产生改动,不做任那边理
end
go
--利用举例
--请求:将c_Stu_Id为004的先生信息挪动到c_Stu_Id为002的先生信息之前的地位.
--挪用存储历程sp_MyAdjustRecordOrder(004,002)便可.
--注重:这里的i_id必需是按次的。
--备份表数据信息,以便于对照
select*
intoStudentsInfoBackup
fromT_StudentsInfo
--对照了局是不是分歧
select*fromStudentsInfoBackup
select*fromT_StudentsInfo
--挪动数据纪录信息,挪用存储历程
execsp_MyAdjustRecordOrder003,002
--对照了局是不是修改
select*fromStudentsInfoBackup
select*fromT_StudentsInfo
在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。 |
|