2012-01-31 2 views
0

Sybase Advantage Databaseоптимизировать запрос для значения последнего автоматического ИНК

Я делаю запрос

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. Тогда следующее утверждение достигнет вашей цели.

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

Однако, если структура таблицы изменится, это утверждение необходимо будет соответствующим образом обновить.

Кстати, ваша оригинальная реализация небезопасна в многопользовательских сценариях. Максимальный ([indexKey]) в выражении UPDATE может не быть тем, который генерируется оператором INSERT. Другой пользователь мог бы вставить еще одну строку между двумя операторами. Чтобы использовать ваш оригинальный подход, вы должны использовать сканер LastAutoInc().

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