оптимизировать запрос для значения last-auto-inc - PullRequest
0 голосов
/ 31 января 2012

База данных 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 Ответ

3 голосов
/ 31 января 2012

Это может быть достигнуто с помощью одного оператора, но это сделает код более восприимчивым к изменениям схемы.Предположим, что в таблице есть 2 дополнительных столбца помимо столбцов FieldName и indexKey.Тогда следующее утверждение достигнет вашей цели.

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

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

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

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