Конвертировать Char PK / FK в Varchar или RTRIM везде? - PullRequest
2 голосов
/ 20 марта 2012

У нас есть БД с несколькими сотнями таблиц с полем CHAR «Код», используемым для различных ресурсов.Это поле кода является первичным и внешним ключом для нескольких таблиц.

Теперь мы отображаем этот код при наведении курсора на ресурс в нашем приложении ASP.NET, а когда код короче длины поля CHAR, он отображаетпробелы.Мы исправляем это с помощью RTRIMing (который часто упускают из виду).

  1. У нас будет от нескольких десятков до сотен активных пользователей, поэтому влияние на производительность не должно быть таким большим
  2. Был бы способ автоматически отбросить и воссоздать все ограничения PK / FK при преобразовании из CHAR в VARCHAR?Я немного посмотрел на INFORMATION_SCHEMA и похоже, что это было бы возможно.

Ответы [ 2 ]

1 голос
/ 20 марта 2012

По моему опыту char вызывает много проблем, а не только неожиданные пробелы во внешнем интерфейсе:

  • Есть логические ошибки, когда сравнение не учитывает конечные пробелы.
  • Когда вы спрашиваете len(): возвращает ли она длину строки, включая или исключая пробелы?
  • char занимает больше места на диске, чем необходимо.Поскольку первичный ключ включается в каждый индекс для своей таблицы, это может увеличивать до нетривиального объема пространства.

Так что, как правило, целесообразно выполнить рефакторинг с char до * 1015.*.

В зависимости от количества имеющихся у вас таблиц, это может быть довольно много работы.Сначала вы должны удалить все противопоказания, которые ссылаются на столбцы.Тогда вы бы:

alter YourTable alter column YourColumn varchar(50) primary key

После этого вы бы снова добавили ограничения.Вы обнаружите, что требуется много попыток добавить / удалить ограничения в правильном порядке.Например, foreign key требует ограничения unique на указанный столбец.Таким образом, вам придется отбросить foreign key до ограничения unique.

Right click database -> Tasks -> Generate Scripts предоставит вам множество операторов для воссоздания ограничений, если не всегда в правильном порядке.

1 голос
/ 20 марта 2012

Я бы не принял решение о том, использовать ли char или varchar, в зависимости от того, как значение отображается во внешнем интерфейсе.

Если вам нужно добавить rtrim везде,вместо этого вы можете создать представление вокруг таблицы, содержащей это поле, и выполнить rtrim только один раз внутри представления.

Однако, поскольку это звучит так, как будто ваше поле не всегда 5 символов, varcharможет быть более подходящим.

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

...