Добавить столбец в существующую таблицу и однозначно пронумеровать их на MS SQL Server

121

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

Например, если я добавлю новый столбец с именем «ID» (номер), я хочу затем инициализировать уникальное значение для каждой записи. Итак, в моем столбце идентификаторов будут записи от say 1 to 1000.
Как я могу это сделать?

Адип Гупта
источник
2
Это будет зависеть от базы данных. Вы должны указать, с какой базой данных вы работаете.
dvorak
1
Вы должны отредактировать свой вопрос, чтобы упомянуть об этом.
dvorak

Ответы:

221

Это будет зависеть от базы данных, но для SQL Server этого можно добиться следующим образом:

alter table Example
add NewColumn int identity(1,1)
Саймон Джонсон
источник
5
Это прекрасно сработало и автоматически добавило все нужные числа. Спасибо!
djangofan
9
Если у вас возникли проблемы с внесением изменений в графический интерфейс студии управления, вы можете изменить настройки в / Tools / Options / Designer / Table and Database Desiger, вы найдете Prevent saving changes that require table re-creationфлажок, снимающий этот флажок, и вы сможете добавить столбец идентификаторов даже с помощью гуй.
surfmuggle
22

Было бы полезно, если бы вы опубликовали, какую базу данных SQL вы используете. Для MySQL вам, вероятно, понадобится auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

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

Том Мартин
источник
7
Я также могу подтвердить, что это действительно работает для MySQL; Я просто добавил поле увеличивающегося идентификатора в существующую неиндексированную таблицу, и каждая строка получила уникальный новый идентификатор.
Дуг Кавендек
Извините, это старый, но в названии написан SQL-сервер.
Ник,
11

для оракула вы можете сделать что-то вроде ниже

alter table mytable add (myfield integer);

update mytable set myfield = rownum;
Рой Тан
источник
8

И эквивалент Postgres (вторая строка обязательна, только если вы хотите, чтобы «id» был ключом):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);
Флавиен Волкен
источник
4

Просто использование ALTER TABLE должно работать. Добавьте столбец с правильным типом и флагом IDENTITY, и он должен помочь

Ознакомьтесь с этой статьей MSDN http://msdn.microsoft.com/en-us/library/aa275462(SQL.80).aspx о синтаксисе ALTER TABLE

Илья Кочетов
источник
3

для типа данных UNIQUEIDENTIFIER на сервере sql попробуйте это

Alter table table_name
add ID UNIQUEIDENTIFIER not null unique default(newid())

Если вы хотите создать первичный ключ из этого столбца, используйте это

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);
Снзив Гупта
источник
0

Зависит от базы данных, поскольку каждая база данных имеет свой способ добавления порядковых номеров. Я бы изменил таблицу, чтобы добавить столбец, а затем написал сценарий db в groovy / python / etc, чтобы прочитать данные и обновить идентификатор с помощью последовательности. После того, как данные были установлены, я бы добавил в таблицу последовательность, которая начинается после верхнего числа. После установки данных правильно установите первичные ключи.

Джошуа
источник
0

Если вы не хотите, чтобы ваш новый столбец имел тип IDENTITY(автоинкремент), или вы хотите указать порядок, в котором нумеруются ваши строки, вы можете добавить столбец типа, INT NULLа затем заполнить его следующим образом. В моем примере новый столбец называется MyNewColumn, а существующий столбец первичного ключа для таблицы называется MyPrimaryKey.

UPDATE MyTable
SET MyTable.MyNewColumn = AutoTable.AutoNum
FROM
(
    SELECT MyPrimaryKey, 
    ROW_NUMBER() OVER (ORDER BY SomeColumn, SomeOtherColumn) AS AutoNum
    FROM MyTable 
) AutoTable
WHERE MyTable.MyPrimaryKey = AutoTable.MyPrimaryKey  

Это работает в SQL Sever 2005 и более поздних версиях, т.е. версиях, поддерживающих ROW_NUMBER()

Jinlye
источник