优化查询last-auto-inc值

时间:2012-01-31 17:50:02

标签: advantage-database-server

Sybase Advantage数据库

我正在进行查询

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

目的是将给定记录复制到新记录中,然后使用一些新值更新新创建的记录。 “indexKey”声明为autoinc,是表的主键。

我不确定这是否可以在速度更快的单一声明中实现,或者;;;建议表示赞赏。

1 个答案:

答案 0 :(得分:3)

可以使用单个语句实现,但它会使代码更容易受到架构更改的影响。假设除了FieldName和indexKey列之外,表中还有2列。然后,以下声明将实现您的目标。

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

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

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

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