Добавить столбец в существующую таблицу и однозначно пронумеровать их на 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);


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()

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.