2012-01-31 80 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)