我想在SQL SERVER中用存储过程或触发器或其他什么功能将超过我设置的最大行数的记录自动删除,不使用其他的应用程序。我该如何做?
12 个解决方案
#1
那就设一个自动增量字段id,每次判断id是否超过你设置的最大行数
不过这样也有问题的,id会一直增长,如果有频繁删除操作的话,这个方法就不行了
不过这样也有问题的,id会一直增长,如果有频繁删除操作的话,这个方法就不行了
#2
触发器里写
delete from czrz where intime>(select max(intime) from (select top 5 intime from czrz order by intime) c)
其中的5就是你设定的最大行数,intime就是你要进行排序的字段。czrz,就是你要删除记录的表
delete from czrz where intime>(select max(intime) from (select top 5 intime from czrz order by intime) c)
其中的5就是你设定的最大行数,intime就是你要进行排序的字段。czrz,就是你要删除记录的表
#3
流星尔的方法是可行的,不过一般删除旧的记录
delete from czrz where intime<(select min(intime) from (select top 5 intime from czrz order by intime desc) c)
delete from czrz where intime<(select min(intime) from (select top 5 intime from czrz order by intime desc) c)
#4
这个办法能解决锁表的问题吗?记得以前有人问过这个问题,在插入记录时使用触发器去删除过期的记录,插入的同时删除,可能会出现死锁的问题,我一直没有时间去测试一下,谁现在有环境,建议测试一下,看是否能行得通。如果可行,以后此类问题就可以用这种方法;如果不行,就不能提供这种方法来误人子弟。
#5
蓝兄说的这么严重,赶紧测试了一下,数据量不大,没有死锁。
但是我想,蓝兄说的有道理,数据量不大的时候,系统自动用的行锁,没有问题,但数据量大的时候,自动升级为表级锁,那就会发生死锁了。
但是我想,蓝兄说的有道理,数据量不大的时候,系统自动用的行锁,没有问题,但数据量大的时候,自动升级为表级锁,那就会发生死锁了。
#6
建立作业,少人用的时候执行删除操作。
#7
假如0:00,2:00
#8
海兄精神可嘉,我想做的事情想了很久,还是让海兄帮我实现了。我想如果不建立集聚索引,新插入的数据和要删除的数据在同一数据页上了,那死锁的可能性就大了。不过这个问题实际测试是一个方面,从数据库的原理上来研究是另一个方面。关于用某个表的触发器来对该表进行增,删,改的操作,其中的事务和锁是如何设置和工作的,看来还得去找更多的资料了。
#9
可以在插入触发器中判断表的总行数,若大于某值加一则删除刚插入的行
#10
呵呵,蓝兄说的对,我用触发器删除刚刚插入的ID的数据,结果没有出错,还有个很好玩的现象,A表原有2000多条数据,我insert a select * from a,
结果把数据表清空了。
结果把数据表清空了。
#11
增加一字段,每次增加新值时其值加一(不用identify),然后在此字段建立约束,使其值不大于你所要的值。
#12
结贴
#1
那就设一个自动增量字段id,每次判断id是否超过你设置的最大行数
不过这样也有问题的,id会一直增长,如果有频繁删除操作的话,这个方法就不行了
不过这样也有问题的,id会一直增长,如果有频繁删除操作的话,这个方法就不行了
#2
触发器里写
delete from czrz where intime>(select max(intime) from (select top 5 intime from czrz order by intime) c)
其中的5就是你设定的最大行数,intime就是你要进行排序的字段。czrz,就是你要删除记录的表
delete from czrz where intime>(select max(intime) from (select top 5 intime from czrz order by intime) c)
其中的5就是你设定的最大行数,intime就是你要进行排序的字段。czrz,就是你要删除记录的表
#3
流星尔的方法是可行的,不过一般删除旧的记录
delete from czrz where intime<(select min(intime) from (select top 5 intime from czrz order by intime desc) c)
delete from czrz where intime<(select min(intime) from (select top 5 intime from czrz order by intime desc) c)
#4
这个办法能解决锁表的问题吗?记得以前有人问过这个问题,在插入记录时使用触发器去删除过期的记录,插入的同时删除,可能会出现死锁的问题,我一直没有时间去测试一下,谁现在有环境,建议测试一下,看是否能行得通。如果可行,以后此类问题就可以用这种方法;如果不行,就不能提供这种方法来误人子弟。
#5
蓝兄说的这么严重,赶紧测试了一下,数据量不大,没有死锁。
但是我想,蓝兄说的有道理,数据量不大的时候,系统自动用的行锁,没有问题,但数据量大的时候,自动升级为表级锁,那就会发生死锁了。
但是我想,蓝兄说的有道理,数据量不大的时候,系统自动用的行锁,没有问题,但数据量大的时候,自动升级为表级锁,那就会发生死锁了。
#6
建立作业,少人用的时候执行删除操作。
#7
假如0:00,2:00
#8
海兄精神可嘉,我想做的事情想了很久,还是让海兄帮我实现了。我想如果不建立集聚索引,新插入的数据和要删除的数据在同一数据页上了,那死锁的可能性就大了。不过这个问题实际测试是一个方面,从数据库的原理上来研究是另一个方面。关于用某个表的触发器来对该表进行增,删,改的操作,其中的事务和锁是如何设置和工作的,看来还得去找更多的资料了。
#9
可以在插入触发器中判断表的总行数,若大于某值加一则删除刚插入的行
#10
呵呵,蓝兄说的对,我用触发器删除刚刚插入的ID的数据,结果没有出错,还有个很好玩的现象,A表原有2000多条数据,我insert a select * from a,
结果把数据表清空了。
结果把数据表清空了。
#11
增加一字段,每次增加新值时其值加一(不用identify),然后在此字段建立约束,使其值不大于你所要的值。
#12
结贴