日期:2014-05-18  浏览次数:20561 次

数据表的删除一项后引发的更新问题
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[G_Question] ')   and   OBJECTPROPERTY(id,   N 'IsUserTable ')   =   1)
drop   table   [dbo].[G_Question]
GO

CREATE   TABLE   [dbo].[G_Question]   (
[questionID]   [int]   identity(1,1)     NOT   NULL   ,
[question]   [varchar]   (90)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[A]   [varchar]   (90)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[B]   [varchar]   (90)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[C]   [varchar]   (90)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[D]   [varchar]   (90)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[E]   [varchar]   (90)   COLLATE   Chinese_PRC_CI_AS   NULL  
)   ON   [PRIMARY]
GO

ALTER   TABLE   [dbo].[G_Question]   ADD  
CONSTRAINT   [PK_G_Question]   PRIMARY   KEY     CLUSTERED  
(
[questionID]
)     ON   [PRIMARY]  
GO

insert   into   G_Question(question,A,B,C,D,E)   values( '您的总体评价 ', '80%以上满意; ', '60~80%满意; ', '40~60%满意; ', '40%以下满意。 ',NULL)  
insert   into   G_Question(question,A,B,C,D,E)   values( '题1的评价 ', '80%以上满意; ', '60~80%满意; ', '40~60%满意; ', '20~%40%; ', '20以下满意。 ')  
insert   into   G_Question(question,A,B,C,D,E)   values( '题2的评价 ', '80%以上满意; ', '60~80%满意; ', '40~60%满意; ', '20~%40%; ', '20以下满意。 ')  
insert   into   G_Question(question,A,B,C,D,E)   values( '题3的评价 ', '80%以上满意; ', '60~80%满意; ', '40~60%满意; ', '20~%40%; ', '20以下满意。 ')  
insert   into   G_Question(question,A,B,C,D,E)   values( '题4的评价 ', '80%以上满意; ', '60~80%满意; ', '40~60%满意; ', '40%以下满意。 ',NULL)  


如此创建完了表,
要求:
不管插入或删除时questionID连续,
自己想法:
用identity实现了插入时只增加,通过删除其中某条记录时,其它记录的questionID随着变化达到目的
如删了questionID为2的一条记录,则由3以后的全部自减1;而删除了questionID为5   的,则5以后的全部自减1,如何创建表的delete触发器实现?请各位帮帮忙~~~~~~~~~
或者,通过别的方法实现?



------解决方案--------------------
设置questionID [int] identity(1,1) NOT NULL
以后是不能直接更新questionID的,具体的请查看IDENTITY 属性帮助内容.

参考的方法:
可以把identity(1,1)去掉,新增加数据的时候questionID 取MAX(questionID )+1,
删除数据的时候,使用触发器来完成部分questionID的重新排序。(对于经常删除数据、数据量大的情况,这样的动作开支是非常大的)



------解决方案--------------------
我不想用你的表和数据,假设了一个表T1(id int , f varchar(10))
插入数据时使用instead触发器
create trigger hyc2 on T1
instead of insert
as
begin
insert T1 select (select max(id)+1 from T1),(select f from inserted)
end
go
删除时用after 触发器,把大于所删除id的id都减一就可以实现了
create trigger hyc on T1
for delete
as
begin
declare @num int
select @num=id from deleted
update T1 set id=id-1 where id> @num
end
go
上千万百万的记录不敢保证效率