2015-10-16 2 views
1

В таблице есть столбец идентификатора, увеличивающийся на единицу при каждом добавлении строки (минимальное значение равно 1). Теперь есть новое требование - нам нужно реализовать мягкое удаление.Как обмануть обновление столбца?

Итак, моя идея состояла в том, чтобы в основном умножить любую мягко удаленную строку на -1. Это гарантирует уникальность и четко рисует линию между активным и мягко удаленным элементом.

update Things set Id = -101 
where Id = 101 

Знаете ли вы, что глупый компьютер не позволяет мне это делать. Предлагаемая работа вокруг заключается в следующем:

  1. чередуются колонка
  2. производить обновление
  3. чередоваться обратно столбец

и мне кажется, что Q & D. Однако, единственная альтернатива, которую я вижу, - это добавить новый столбец, содержащий статус удаления.

Я использую EF для выполнения работы с дополнительной причуда, что, когда я изменил значение идентичности и хранить его, программное обеспечение было достаточно любезен, чтобы думать, для меня, и на самом деле создать новую строку (с приращением установленный личность, которая не была ни оригинальной, ни отрицательной ее).

Как мне решить эту проблему?

+0

Вы пробовали свое 'UPDATE' с' SET IDENTITY_INSERT dbo.Things ON'? – stakx

+0

@stakx Нет, не знаю. В основном потому, что я не знал об этом. Теперь, когда я это делаю, я все еще не могу - это может быть связано со мной на Sql Server. Во всяком случае, мы будем делать это из Entity Framework, и я не уверен, как сделать эквивалент от этого (или, если это вообще возможно). –

ответ

8

Я бы категорически отказался от перегрузки столбца с любым дополнительным значением. Тот, кто впервые посмотрит на вашу таблицу базы данных, не знает, что отрицательный идентификатор означает «удаленный».

Ввод новой колонки Deleted BIT NOT NULL DEFAULT 0 не имеет этого недостатка. Это самоочевидно. И это почти ничего не стоит: во времена Big Data дополнительный столбец BIT не собирается заполнять ваш жесткий диск.

Все это, если вы все еще хотите это сделать, вы можете попробовать SET IDENTITY_INSERT dbo.Things ON перед вами UPDATE. (В настоящее время я не могу проверить, будет ли это работать.)

+0

'SET IDENTITY_INSERT' не помогло бы, это должно быть сделано в том же сеансе, что и команда, и это не относится к обновлениям. Конечно, вы абсолютно правы, что это безнадежная оценка. Нарушение внешних ключей даже не упоминалось. –

+0

@ Gert: Спасибо за ваш вклад. Что касается разрыва внешних ключей, это может быть смягчено (несколько) с помощью правил «ON UPDATE CASCADE». Но я согласен с тем, что изменить первичный ключ просто не очень хорошо. – stakx

Смежные вопросы