Dodaj kolumny do istniejącej tabeli i jednoznacznie ponumeruj je na serwerze MS SQL

121

Chcę dodać kolumnę do istniejącej starszej bazy danych i napisać procedurę, za pomocą której mogę przypisać każdemu rekordowi inną wartość. Coś jak dodanie kolumny i automatyczne generowanie dla niej danych.

Na przykład, jeśli dodam nową kolumnę o nazwie „ID” (numer), chcę następnie zainicjować unikalną wartość dla każdego z rekordów. Więc moja kolumna ID będzie zawierała rekordy od powiedz 1 to 1000.
W jaki sposób mogę to zrobić?

Adhip Gupta
źródło
2
To będzie dotyczyło bazy danych. Powinieneś określić, z jaką bazą danych pracujesz.
dvorak
1
Aby o tym wspomnieć, zmodyfikuj swoje pytanie.
dvorak

Odpowiedzi:

221

Będzie to zależeć od bazy danych, ale w przypadku programu SQL Server można to osiągnąć w następujący sposób:

alter table Example
add NewColumn int identity(1,1)
Simon Johnson
źródło
5
To działało pięknie i automatycznie dodawało wszystkie potrzebne mi liczby. Dzięki!
djangofan
9
Jeśli masz problemy z wprowadzeniem zmian za pomocą interfejsu użytkownika studia zarządzania, możesz zmienić ustawienia w / Narzędzia / Opcje / Projektant / Tabela i Desiger bazy danych, znajdziesz pole wyboru Prevent saving changes that require table re-creationodznacz to pole i będziesz mógł dodać kolumnę tożsamości nawet za pomocą gui.
surfmuggle
22

Byłoby pomocne, gdybyś opublikował, jakiej bazy danych SQL używasz. W przypadku MySQL prawdopodobnie chcesz auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Nie jestem pewien, czy to powoduje zastosowanie tych wartości z mocą wsteczną. Jeśli tak nie jest, powinieneś po prostu móc iterować swoje wartości za pomocą procedury składowanej lub prostego programu (o ile nikt inny nie pisze do bazy danych) i ustawić użycie LAST_INSERT_ID()funkcji do wygenerowania wartości id.

Tom Martin
źródło
7
Równie dobrze mogę potwierdzić, że to rzeczywiście działa w przypadku MySQL; Właśnie dodałem zwiększające się pole id do istniejącej niezindeksowanej tabeli, a każdy wiersz otrzymał unikalny nowy identyfikator.
Doug Kavendek,
Przepraszam, że to stary, ale w tytule był napisany serwer SQL.
Nick
11

dla wyroczni możesz zrobić coś takiego jak poniżej

alter table mytable add (myfield integer);

update mytable set myfield = rownum;
Roy Tang
źródło
8

I odpowiednik Postgres (druga linia jest obowiązkowa tylko wtedy, gdy chcesz, aby „id” było kluczem):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);
Flavien Volken
źródło
3

dla typu danych UNIQUEIDENTIFIER na serwerze sql spróbuj tego

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

Jeśli chcesz utworzyć klucz podstawowy z tej kolumny, użyj tego

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);
Snziv Gupta
źródło
0

Zależy od bazy danych, ponieważ każda baza danych ma inny sposób dodawania numerów sekwencyjnych. Zmieniłbym tabelę, aby dodać kolumnę, a następnie napisać skrypt db w groovy / python / etc, aby wczytać dane i zaktualizować identyfikator sekwencją. Po ustawieniu danych dodałbym do tabeli sekwencję rozpoczynającą się po najwyższej liczbie. Po ustawieniu danych ustaw poprawnie klucze podstawowe.

Joshua
źródło
0

Jeśli nie chcesz, aby nowa kolumna była typu IDENTITY(autoinkrementacja) lub chcesz dokładnie określić kolejność numerowania wierszy, możesz dodać kolumnę typu, INT NULLa następnie wypełnić ją w ten sposób. W moim przykładzie nowa kolumna nosi nazwę MyNewColumn, a istniejąca kolumna klucza podstawowego tabeli nosi nazwę 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  

Działa to w SQL Sever 2005 i późniejszych, tj. Wersjach, które obsługują ROW_NUMBER()

Jinlye
źródło