Мне нужно изменить столбец уникальный идентификатор таблицы - PullRequest
0 голосов
/ 28 сентября 2011

Не уверен, что лучший способ сделать это, или если есть хотя бы один лучший ответ, но вот проблема:

У меня есть база данных SQL Server 2000, которая состоит как минимум из 13 таблиц.Некоторые из таблиц имеют уникальный идентификатор (SysName), поэтому может быть только одно уникальное значение SysName (alpha001, alpha002, alpha003 и т. Д.).

Со мной так далеко?

Теперь клиент хочет иметь возможность вставить несколько значений sysnames в базу данных (alpha001, alpha001, alpha001, alpha002, alpha002, alpha003, alpha003, alpha003, alpha003, alpha003 и т. Д.).Кроме того, если вы измените значение для sysname (альфа001 на бета001) в одной таблице, значение в некоторых других таблицах также будет обновлено (у меня есть мозговая болтовня о том, как это называется в данный момент),

Я также хотел бы добавить новый столбец (SysNameID) и установить для него автоинкремент.Каков наилучший способ сделать это, чтобы он прошел через базу данных и просто добавил значения SysNameID (1,2,3,4,5,6 ...), чтобы мне не пришлось перестраивать таблицу?

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

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

Ответы [ 2 ]

3 голосов
/ 28 сентября 2011

Базовый процесс:

Убедитесь, что у вас есть текущая резервная копия, и не пытайтесь сделать это на Prod без сквозного теста на развитие в первую очередь.Это настолько серьезное изменение, что вы можете захотеть восстановить prod для нового экземпляра dev, потому что это будет трудоемким и сложным, а другие разработки будут мешать, пока вы делаете это.

Вы добавляете столбец идентификаторов в родительскую таблицу с именем SysNameID (подробности см. В ответе @marc_s)

Вы добавляете столбец int в каждую дочернюю таблицу, также называемую SysNameId.Это не автоинкрементный столбец, и он должен содержать пустые значения.

Вы обновляете этот столбец, используя текущие столбцы sysname, чтобы найти идентификатор, связанный с этим sysname.

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

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

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

Рекомендуемое чтение: http://www.amazon.com/Refactoring-Databases-Evolutionary-Database-Design/dp/0321293533/ref=sr_1_1?ie=UTF8&s=books&qid=1268158669&sr=8-1

3 голосов
/ 28 сентября 2011

Я не совсем понимаю, что ваш вопрос / вызов с текущим sysname столбец ....

, но для второй части: да, вы можете легко добавить автоинкрементный столбец к вашим таблицам, и нет, вам не нужно ничего делать (например, «перестроить таблицу») - что бы это ни было .....) - SQL Server заполнит существующие строки значениями автоинкремента. $

ALTER TABLE dbo.YourTableNameHere
   ADD SysNameID INT IDENTITY(1,1) NOT NULL

Обычно я рекомендую сделать этот столбец IDENTITY либо вашим первичным (и кластеризованным) ключом для таблицы, либо, если это невозможно, по крайней мере поместите в столбец UNIQUE CONSTRAINT, чтобы избежать вставки повторяющихся значений:

ALTER TABLE dbo.YourTableNameHere
  ADD CONSTRAINT UC_SysNameID UNIQUE(SysNameID)
...