2012-01-31 35 views
0

的Sybase利用数据库优化查询最后自动INC值

我做一个查询

INSERT INTO nametable 
SELECT * FROM nametable WHERE [indexkey]=32; 
UPDATE nametable Set FieldName=1 
WHERE [IndexKey]=(SELECT max([indexKey]) FROM nametable); 

的目的是为了给定的记录复制到一个新的记录,然后更新新创建记录一些新的价值。 “indexKey”被声明为autoinc,并且是表的主键。

我不确定这是否可以以更快的速度在单个声明中实现,或者;;;建议感激。

回答

3

它可以用一个语句来实现,但它会使代码更容易受到模式更改的影响。假设除了FieldName和indexKey列之外,表中还有2个额外的列。那么下面的陈述将实现你的目标。

INSERT INTO nametable (FieldName, Column2, Column3) 
SELECT 1, Column2, Column3 FROM nametable WHERE [indexkey]=32 

但是,如果表结构发生变化,则需要相应更新此语句。

顺便说一句,你的原始实现在多用户场景中是不安全的。 UPDATE语句中的max([indexKey])可能不是由INSERT语句生成的。另一个用户可能在两个语句之间插入另一行。要使用原始方法,您应该使用LastAutoInc()标量。

UPDATE nametable Set FieldName=1 
WHERE [IndexKey] = LastAutoInc(STATEMENT)