2016-02-24 3 views
0

Я вижу, что этот вопрос задавался много раз с довольно хорошими результатами, однако этот отличается тем, что мы хотим вернуться к нормальному идентификатору автоматического увеличения после того, как мы добавили альфа-числовые идентификаторы.reverting alpha numeric identity

У нас есть 3 базы данных, которые в конечном итоге будут объединены в единую базу данных. Чтобы наша система оставалась совместимой, нам нужно, чтобы идентификаторы сохранялись в процессе слияния. До сих пор нам удалось объединить данные в алфавитном порядке, где мы префикс идентификатора записи с источником базы данных, например идентификаторы, которые поступали из DBAA, теперь AA ## и DBBB теперь BB ##.

Вопрос теперь, однако, можно ли вернуть столбец идентификатора varchar обратно в числовое число автоматического увеличения, не добавляя больше столбцов или создавая функции в конце? Идея состоит в том, что следующая запись в новой объединенной БД будет на один выше, чем самая высокая из 3-х БД, поэтому, если AA10 был самым высоким, следующая запись будет 11. (без префикса и без функции на заднем конце)

CREATE TABLE tableTest 
(
    colID varchar(50) PRIMARY KEY, 
    [desc] varchar(10) NOT NULL 
) 
ALTER TABLE tableTest ALTER COLUMN colID int NOT NULL IDENTITY(1,1) 

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

+1

Подумайте об этом на секунду. У вас есть значения, такие как AA14, и вы хотите изменить столбец на int. Это никогда не сработает. То, что вы описываете, это две части информации, источник данных и числовое значение. НЕ заставляйте эти две части информации в одну колонку. Это нарушает 1NF и вызывает невыразимое количество боли. Вместо этого создайте два столбца, по одному для каждой части информации. –

+1

Кроме того, если память используется, вы не можете изменить существующий столбец в столбец идентификатора –

+0

@ ZoharPeled, это правильно, и я должен был упомянуть об этом ранее. Было так много других логических проблем, о которых я даже не думал об этой тонкости. :) –

ответ

1

Итак, подведем итоги Шона и мои комментарии - ответ - нет.
Это невозможно по многим причинам.

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

UPDATE tableTest 
    SET colId = REPLACE(REPLACE(REPLACE(colId, 'AA', ''), 'BB', ''), 'CC', '') + 
    CASE 
     WHEN colId LIKE 'AA%' THEN '1' 
     WHEN colId LIKE 'BB%' THEN '2' 
     WHEN colId LIKE 'CC%' THEN '3' 
    END 

Таким образом, текущее номер части остается наиболее значимыми цифрами - поэтому, если ваша таблица содержала значения, такие как
. AA1, BB5, CC7, AA30, BB12, он теперь будет содержать эти значения:
. 11, 52, 73, 301, 122 - как вы можете видеть, «порядок» сохранен.

Другой вариант - добавить новый столбец идентификации, удалить текущий столбец colID и переименовать столбец идентификации в colID.
Этого можно достичь либо с помощью конструктора таблиц ssms, либо с помощью sp_rename.
Обратите внимание, что если вы не используете конструктор таблиц, вам придется сначала удалить ограничение первичного ключа, прежде чем вы сможете удалить столбец.

+0

да, данные уникальны для начала, из-за причины, если вы объедините 3 таблицы, это уже не будет уникальным, то, что вы там сделали, хотя имеет смысл и должно работа нет проблем.Цель состоит в том, чтобы сохранить идентификаторы, создавая новый тип colid. Если старые идентификаторы также хранятся в отдельной колонке. Спасибо за помощь. –

+0

рад помочь :-) –