Лучший способ проверить, была ли строка обновлена ​​в SQL - PullRequest
7 голосов
/ 30 марта 2009

У меня есть оператор обновления, который обновляет таблицу. И есть столбец, который записывает время последнего изменения. Если данные в конкретной строке не были изменены, я не хочу менять дату последнего изменения.

Как лучше всего проверить, изменит ли оператор обновления строку данных или нет.

Спасибо

Ответы [ 8 ]

9 голосов
/ 30 марта 2009

Проверьте старые и новые данные в вашем коде вместо того, чтобы делать это в запросе.

Нет необходимости излишне беспокоить слой БД, если данные вообще не изменились.

Короче говоря, если данные не изменились, не отправляйте оператор UPDATE.

2 голосов
/ 30 марта 2009

Один из способов - начать транзакцию, выбрать содержимое строки и сравнить ее с тем, что вы собираетесь обновить. Если они не совпадают, выполните обновление и завершите транзакцию. Если они совпадают, откат транзакции.

1 голос
/ 04 мая 2011

Если вы используете sql 2005/2008, то в хранимой процедуре вы можете сделать следующее:

update  newTable 
set     readKey='1'
output  inserted.id,
        inserted.readKey as readKey,
        deleted.readKey as prevReadKey
into @tempTable
where id = '1111'

Затем вы можете выбрать из @tempTable, чтобы проверить, имеют ли значения prevReadKey и readKey одинаковые значения, если оба имеют одинаковое значение, вы можете сбросить свой последний измененный datetime.

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

P.S. ПРИМЕЧАНИЕ. - Данный запрос может быть синтаксически неправильным, поскольку он не проверен. Но так ваша проблема может быть решена. Я сделал это следующим образом, используя предложение OUTPUT с оператором Merge в одном из моих проектов, и это также можно сделать с помощью оператора update. Вот ссылка предложения OUTPUT

1 голос
/ 30 марта 2009

Это зависит от того, контролируете ли вы данные или нет. Выше приведено правильное утверждение о том, что перед обновлением вы должны проверить старые данные на соответствие новым. Но что, если данные не находятся под вашим контролем?

Скажем, вы веб-сервис, который просит сделать обновление. Тогда единственным способом проверки будет запрос существующих данных и сравнение их с новыми данными.

Не знаю каких-либо функций SQL, которые бы определяли, действительно ли обновление изменило какие-либо данные.

В SQL есть способы определения количества строк, включенных в оператор обновления. Не знаю, как определить, действительно ли оператор обновления изменил какие-либо данные, что было бы интересно узнать.

1 голос
/ 30 марта 2009

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

Не делай этого в два прохода. Просто обновите дату / время одновременно с обновлением любых других столбцов, которые вы меняете:

UPDATE myTable
SET retailprice = wholesaleprice * 1.10,
    lastmodified = GetDate()
WHERE ...

Или вы выполняете оператор обновления для ВСЕХ строк, но для большинства строк он просто устанавливает значение, которое у него уже есть? Не делай этого. Исключите те строки, которые не будут изменены в предложении where:

UPDATE myTable
SET retailprice = wholesaleprice * 1.10,
    lastmodified = GetDate()
WHERE retailprice <> wholesaleprice * 1.10
1 голос
/ 30 марта 2009

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

1 голос
/ 30 марта 2009

Если вы хотите сделать это превентивно, единственный способ, которым я могу думать, что вы это сделаете, - это изменить предложение WHERE оператора обновления, чтобы сравнить существующее значение с новым значением (для КАЖДОГО значения). Если ЛЮБЫХ из них не равны, то обновление должно произойти.

0 голосов
/ 30 марта 2009

Вы МОЖЕТЕ написать триггер INSTEAD OF UPDATE в T-SQL, где вы можете сделать то, что было предложено выше на уровне DAL - сравнить значения в существующей записи со значениями в операторе обновления и применить либо обновлять или нет. Вы можете использовать функцию Columns_Updated () в триггере, чтобы увидеть, обновлено ли что-нибудь, и действовать соответствующим образом.

Это не особенно эффективно с точки зрения машины, но вы можете написать ее один раз, и она будет справляться с этой ситуацией независимо от того, какое приложение, хранимая процедура или другой процесс пытались обновить запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...