回答1:因为表中已有ID为主键,NOT NULL。所以在执行INSERT时,它会检查ID是否为空。因此会出现错误。触发器是在INSERT执行后,但还没提交(COMMIT)时发生的。可以通过在ID中写入一个整数,但不会在表中出现的值,比如-1。
我认为可这样写:
create trigger autoincreate on frienslist
for insert
as
declare @row int,@id int
select @row=@@rowcount
if @row>1
begin
print 'can't insert more than one row'
rollback tran
end
update friendslist set id=id where 1=2/*锁定这个表*/
select @id=max(id)+1 from friendslist
update friendslist set id=@id from friendslist,inserted where friendslist.id=inserted.id
go
我认为可这样写:
create trigger autoincreate on frienslist
for insert
as
declare @row int,@id int
select @row=@@rowcount
if @row>1
begin
print 'can't insert more than one row'
rollback tran
end
update friendslist set id=id where 1=2/*锁定这个表*/
select @id=max(id)+1 from friendslist
update friendslist set id=@id from friendslist,inserted where friendslist.id=inserted.id
go
解决方案 »
- 求SQL语句
- 一个找不到全文索引服务的问题?
- 关系代数的除法,大家给点建议
- 一个update 的写法求解
- 关于JSP的数据库结果集的操作问题,
- 数据库文件(mdb)莫明增长10M,请大家帮忙找找原因?
- 求一个存储过程得到一个新表
- 请教往一个表逐列插入的SQL语句
- sqlserver2000企业版怎样才能在winxp中安装
- 请教高手能否实现以下应用,总部和分部的应用:总部hp服务器,内装sql server,ADSL 无固定ip地址;分部 ADSL 无固定ip地址;如何做应用实现分部向总部sql server 送数据,用com 做三层结构是否可行?
- 下面有一段代码,大家帮忙解释一下?
- 如何操作image类型的字段(sql)?
create trigger autoincreate on frienslist
for insert
as
declare @row int,@id int
select @row=@@rowcount
if @row>1
begin
print 'can't insert more than one row'
rollback tran
end
else
begin
update friendslist set id=id where 1=2/*锁定这个表*/
select @id=max(id)+1 from friendslist
update friendslist set id=@id from friendslist,inserted where friendslist.id=inserted.id
end
go
还有,请仔细解释一下这句怎么锁定表:
update friendslist set id=id where 1=2/*锁定这个表*/辛苦了。
在SQL SERVER中执行UPDATE操作,如果不COMMIT,将会在表上维持独占锁。这时,其它事务会话无法访问这个表,因此锁表。实际上在INSERT触发器中,它们实际是在一个事务中,还没COMMIT,表已经锁住了。这句可有可无。
用update friendslist set id=id where 1=2/*锁定这个表*/,这句即发出了UPDATE语句请求一个独占锁,又因为条件1=2始终为假,所以SERVER可以马上判断不必进行实际硬盘的操作,但锁已经有了。
与INSERTED类似,在DELETE触发器中有DELETED表,代表在DELETE语句中所删除的记录。而在UPDATE触发器中同时有INSERTED,DELETED表。分别代表更新前的数据(DELETED)和更新后的数据(INSERTED)。
因为我想学写触发器:)