Nie można zmienić istniejących kolumn pod kątem tożsamości.
Masz 2 opcje,
Utwórz nowy stół z tożsamością i upuść istniejący stół
Utwórz nową kolumnę z tożsamością i upuść istniejącą kolumnę
Podejście 1. ( Nowa tabela ) Tutaj możesz zachować istniejące wartości danych w nowo utworzonej kolumnie tożsamości.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Sposób 2 ( nowa kolumna ) Nie można zachować istniejące wartości danych na kolumny tożsamości nowo utworzonej, Kolumna tożsamości odbędzie sekwencję numeru.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Aby uzyskać więcej informacji, zobacz następujący post na forum Microsoft SQL Server:
Jak zmienić kolumnę na tożsamość (1,1)
IDENTITY(1, 1)
część z kolumną klucza podstawowegoW SQL 2005 i nowszych istnieje sposób na rozwiązanie tego problemu bez zmiany stron danych tabeli. Jest to ważne w przypadku dużych tabel, w których dotknięcie każdej strony danych może zająć minuty lub godziny. Sztuczka działa także, nawet jeśli kolumna tożsamości jest kluczem podstawowym, jest częścią indeksu klastrowanego lub nieklastrowanego lub innych gotchas, które mogą wyzwalać prostsze rozwiązanie „dodaj / usuń / zmień nazwę kolumny”.
Oto sztuczka: możesz użyć instrukcji ALTER TABLE ... SQL SWITCH programu SQL Server, aby zmienić schemat tabeli bez zmiany danych, co oznacza, że możesz zastąpić tabelę TOŻSAMOŚCIĄ o identycznym schemacie tabeli, ale bez kolumny TOŻSAMOŚCI. Ta sama sztuczka działa, aby dodać TOŻSAMOŚĆ do istniejącej kolumny.
Zwykle ALTER TABLE ... SWITCH służy do skutecznego zastąpienia pełnej partycji w podzielonej na partycje tabeli nową, pustą partycją. Ale może być również używany w niepodzielonych na partycje tabelach.
Użyłem tej sztuczki, aby w ciągu 5 sekund przekonwertować kolumnę tabeli o wartości 2,5 miliarda wierszy z IDENTITY na non-TOŻSAMOŚĆ (w celu uruchomienia wielogodzinnego zapytania, którego plan zapytań działał lepiej w przypadku braku tożsamości kolumny), a następnie przywrócono ustawienie TOŻSAMOŚĆ, ponownie w mniej niż 5 sekund.
Oto przykładowy kod tego, jak to działa.
Jest to oczywiście bardziej zaangażowane niż rozwiązania w innych odpowiedziach, ale jeśli twój stół jest duży, może to być naprawdę uratowanie życia. Istnieje kilka zastrzeżeń:
Jest dobry artykuł na temat TechNet szczegółowo opisujący powyższe wymagania.
AKTUALIZACJA - Eric Wu miał poniżej komentarz, który dodaje ważne informacje o tym rozwiązaniu. Skopiuj go tutaj, aby mieć większą uwagę:
Jeśli tabela jest aktywnie rozszerzana o nowe wiersze (co oznacza, że nie masz dużo, jeśli masz jakiekolwiek przestoje między dodaniem TOŻSAMOŚCI a dodaniem nowych wierszy, to zamiast tego
DBCC CHECKIDENT
będziesz chciał ręcznie ustawić wartość początkową tożsamości w nowym schemacie tabeli na większy niż największy istniejącego ID w tabeli, npIDENTITY (2435457, 1)
. może być w stanie uwzględnić zarównoALTER TABLE...SWITCH
aDBCC CHECKIDENT
w transakcji (lub not-- nie testowałem tego), ale wydaje się, że ustawienie wartości początkowej ręcznie będzie łatwiejsze i bezpieczniejsze.Oczywiście, jeśli żadne nowe wiersze nie są dodawane do tabeli (lub są dodawane tylko sporadycznie, jak codzienny proces ETL), to ten warunek wyścigu nie nastąpi, więc
DBCC CHECKIDENT
jest w porządku.źródło
DBCC CHECKIDENT('<newTableName>')
natychmiast po zmianie. Aby uzyskać więcej informacji, zobacz msdn.microsoft.com/en-us/library/ms176057.aspx .Nie możesz zmienić kolumny na kolumnę TOŻSAMOŚCI. To, co musisz zrobić, to utworzyć nową kolumnę, która jest zdefiniowana jako TOŻSAMOŚĆ od samego początku, a następnie upuść starą kolumnę i zmień nazwę nowej na starą.
Marc
źródło
Jest fajne rozwiązanie opisane tutaj: SERWER SQL - Dodaj lub usuń właściwość tożsamości w kolumnie
W skrócie ręcznie edytuj swoją tabelę w SQL Managerze, przełącz tożsamość, NIE ZAPISUJ zmian, po prostu pokaż skrypt, który zostanie utworzony dla zmian, skopiuj go i użyj go później.
Jest to ogromna oszczędność czasu, ponieważ (skrypt) zawiera wszystkie klucze obce, indeksy itp. Związane ze zmienianą tabelą. Pisanie tego ręcznie ... Boże broń.
źródło
Rozważ użycie SEKWENCJI zamiast TOŻSAMOŚCI .
W SQL Server 2014 (nie wiem o niższych wersjach) możesz to zrobić po prostu, używając sekwencji.
Stąd: Sekwencja jako wartość domyślna dla kolumny
źródło
Proste wyjaśnienie
Zmień nazwę istniejącej kolumny za pomocą sp_RENAME
EXEC sp_RENAME „Table_Name.Existing_ColumnName”, „New_ColumnName”, „COLUMN”
Przykład zmiany nazwy:
Nazwa istniejącej kolumny UserID zostaje zmieniona na OldUserID
Następnie dodaj nową kolumnę za pomocą zapytania alter, aby ustawić jako klucz podstawowy i wartość tożsamości
Przykład ustawienia klucza podstawowego
Nowo utworzona nazwa kolumny to UserID
następnie upuść nazwę kolumny o zmienionej nazwie
Przykład dla kolumny o zmienionej nazwie
Teraz dodaliśmy klucz podstawowy i tożsamość do istniejącej kolumny w tabeli.
źródło
Jestem programistą Java, który akurat dostał się do zespołu bez DBA, a jako programista nie mogę uzyskać uprawnień DBA. Zadanie polegało na przeniesieniu całego schematu między dwiema bazami danych, więc bez DBA musiałem to zrobić, wykonując skrypty, nie mogąc korzystać z GUI w SQL Server 2008, ponieważ nie miałem uprawnień administratora.
Wszystko zostało przeniesione bez problemu, jednak podczas uruchamiania procedury składowanej na nowym schemacie. Schema.table odkryłem, że straciłem pole tożsamości w tabeli. Dokładnie sprawdziłem skrypt, który utworzył tabelę i tam był, jednak SQL Server nie dostał go, kiedy uruchomiłem skrypt. DBA powiedział mi później, że widział ten sam problem wcześniej.
W każdym razie, dla SQL Server 2008, są to kroki, które podjąłem, aby rozwiązać ten problem i zadziałały, więc zamieszczam to tutaj w nadziei, że będzie to komuś pomocne. To właśnie zrobiłem, ponieważ miałem zależności FK od innego stołu, co utrudniło to:
Użyłem tego zapytania, aby sprawdzić, czy rzeczywiście brakuje tożsamości i zobaczyć zależności od tabeli.
1.) Znajdź statystyki na stole:
2.) Utwórz duplikat, identyczną nową tabelę, z wyjątkiem tego, że dodaj pole tożsamości w polu PK, w którym było wcześniej.
3.) Wyłącz tożsamość, aby przenieść dane.
4.) Prześlij dane.
5.) Sprawdź, czy dane tam są.
6.) Ponownie włącz tożsamość.
7.) To najlepszy skrypt, jaki znalazłem, aby uzyskać wszystkie relacje z FK, aby zweryfikować, która tabela (-y) w oryginalnej tabeli odwołuje się do zależności i natknąłem się na wiele, więc jest to opiekun!
8.) Przed następnym krokiem upewnij się, że masz wszystkie skrypty PK i FK dla wszystkich zaangażowanych tabel.
9.) Możesz kliknąć prawym przyciskiem myszy każdy klucz i wykonać skrypt za pomocą SQL Server 2008
10.) Usuń FK z tabel zależności, używając tej składni:
11.) Upuść oryginalny stół:
13.) Następne kroki opierają się na skryptach utworzonych w SQL Server 2008 w kroku 9.
- Dodaj PK do nowej tabeli.
- Dodaj FK do nowego stołu.
- Dodaj FK z powrotem do tabeli zależności.
14.) Sprawdź, czy wszystko jest poprawne i kompletne. Użyłem GUI do przeglądania tabel.
15.) Zmień nazwę nowej tabeli na pierwotną nazwę tabeli.
Wreszcie wszystko działało!
źródło
nie można tego zrobić w ten sposób, należy dodać kolejną kolumnę, upuścić oryginalną kolumnę i zmienić nazwę nowej kolumny lub utworzyć nową tabelę, skopiować dane i upuścić starą tabelę, a następnie zmienić jej nazwę na starą stół
jeśli używasz SSMS i ustawisz właściwość tożsamości na ON w projektancie, oto, co robi SQL Server za kulisami. Jeśli więc masz tabelę o nazwie [użytkownik], dzieje się tak, jeśli podasz identyfikator użytkownika i tożsamość
Powiedziawszy, że istnieje sposób na zhakowanie tabeli systemowej, aby to osiągnąć, ustawiając wartość bitową, ale nie jest to obsługiwane i nie zrobiłbym tego
źródło
Jak rozumieć w normalnych przypadkach tworzymy tabelę z klucza podstawowego , który jest o właściwość Identity
So Zmień nazwę lub Usuń kolumnę, która jest związana z kluczem podstawowym ograniczeniem nie będzie możliwe, ponieważ zasady ograniczające potwierdzania strukturę kolumn.
Aby to osiągnąć, musimy wykonać kilka kroków w następujący sposób:
Załóżmy, że TableName = „Employee” i ColumnName = „EmployeeId”
1. Dodaj nową kolumnę „EmployeeId_new” w tabeli „Employee”
ALTER TABLE Pracownik ADD EmployeeId_new INT TOŻSAMOŚĆ ( 1,1)
Teraz usuń kolumnę „EmployeeId” z tabeli „Employee”
ALTER TABLE Pracownik DROP COLUMN EmployeeId
Spowoduje to wygenerowanie błędu, ponieważ obowiązują reguły ograniczeń klucza głównego i sprawdzanie poprawności struktury kolumny.
* ### ' Msg 5074, poziom 16, stan 1, wiersz 1 Obiekt [PK_dbo.Employee] jest zależny od colmn [EmployeeId]. ” ###
Musimy więc najpierw usunąć ograniczenie klucza podstawowego z tabeli „Pracownik”, a następnie możemy usunąć kolumnę
ALTER TABLE Ograniczenie DROP pracownika [PK_dbo.Employee]
Teraz możemy usunąć kolumnę „EmployeeId” z tabeli „Employee”, tak jak w poprzednim kroku, w którym wystąpił błąd
ALTER TABLE Pracownik DROP COLUMN EmployeeId
Teraz kolumna „EmployeeId” usunięta z tabeli Więc zmienimy nazwę nowo dodanej nowej kolumny „EmployeeId_new” na „EmployeeId”
sp_rename „Employee.EmployeeId”, „EmployeeId_new”, „COLUMN”
Aby zmienić układ tabeli w takiej samej formie, w jakiej była, musimy dodać Ograniczenie klucza głównego dla kolumny „EmployeeId”
ALTER TABLE Pracownik dodać ograniczenie [PK_dbo.Employee] klucz podstawowy (EmployeeId)
8. Teraz tabela „Pracownik” z „EmployeeId” została zmodyfikowana dla reguł tożsamości wraz z istniejącym ograniczeniem klucza podstawowego
źródło
Z założenia nie ma prostego sposobu włączenia lub wyłączenia funkcji tożsamości dla istniejącej kolumny. Jedynym czystym sposobem na to jest utworzenie nowej kolumny i uczynienie z niej kolumny tożsamości lub utworzenie nowej tabeli i migracja danych.
Jeśli użyjemy SQL Server Management Studio, aby pozbyć się wartości tożsamości w kolumnie „id”, tworzona jest nowa tabela tymczasowa, dane są przenoszone do tabeli tymczasowej, stara tabela jest usuwana, a nowa tabela jest zmieniana.
Użyj Management Studio, aby wprowadzić zmiany, a następnie kliknij projektanta prawym przyciskiem myszy i wybierz „Generuj skrypt zmian”.
Zobaczysz, że to właśnie robi serwer SQL w tle.
źródło
Niestety nie ma jednego; właściwość TOŻSAMOŚĆ należy raczej do tabeli niż do kolumny.
Najprostszym sposobem jest zrobienie tego w GUI, ale jeśli nie jest to opcja, możesz przejść długą drogę kopiowania danych, upuszczania kolumny, dodawania jej z tożsamością i przywracania danych.
Zobacz tutaj konto blow-by-blow.
źródło
Kliknij prawym przyciskiem myszy nazwę tabeli w Eksploratorze obiektów. Dostaniesz kilka opcji. Kliknij „Projekt”. Zostanie otwarta nowa karta dla tej tabeli. Możesz dodać ograniczenie tożsamości tutaj w „Właściwościach kolumny”.
źródło
Aby zmodyfikować właściwości tożsamości dla kolumny:
To wszystko i zadziałało dla mnie
źródło
Jeśli akurat używasz programu Visual Studio 2017+
To wszystko dla ciebie zrobi.
źródło
Jeśli oryginalny plakat naprawdę chciał ustawić istniejącą kolumnę
PRIMARY KEY
na tabelę i faktycznie nie potrzebował kolumny jakoIDENTITY
kolumny (dwie różne rzeczy), można to zrobić za pomocą t-SQL za pomocą:Zwróć uwagę na nawias wokół nazwy kolumny po
PRIMARY KEY
opcji.Chociaż ten post jest stary i zakładam, że potrzeby osób żądających, uważam, że te dodatkowe informacje mogą być pomocne dla użytkowników napotykających ten wątek, ponieważ uważam, że rozmowa może prowadzić do przekonania, że istniejącej kolumny nie można ustawić jako klucz podstawowy bez dodawania go jako nowej kolumny, co byłoby niepoprawne.
źródło
Zgodnie z moim obecnym stanem stosuję to podejście. Chcę nadać tożsamość tabeli podstawowej po danych wstawionych za pomocą skryptu.
Ponieważ chcę dołączyć tożsamość, zawsze zaczynam od 1 do końca rekordu, który chcę.
Spowoduje to utworzenie tej samej kolumny klucza podstawowego z tożsamością
Użyłem tego linku: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Dodaj klucz podstawowy do istniejącej tabeli
źródło
Nie sądzę, że można zmienić istniejącą kolumnę na kolumnę tożsamości za pomocą tsql. Można to jednak zrobić w widoku projektu Enterprise Manager.
Alternatywnie możesz utworzyć nowy wiersz jako kolumnę tożsamości, upuścić starą kolumnę, a następnie zmienić nazwę nowej kolumny.
źródło
Zasadniczo istnieją cztery logiczne kroki.
Utwórz nową kolumnę Tożsamość. Włącz Wstaw tożsamość dla tej nowej kolumny.
Wstaw dane z kolumny źródłowej (kolumny, którą chcesz przekonwertować na Tożsamość) do tej nowej kolumny.
Wyłącz wstawianie tożsamości dla nowej kolumny.
Upuść kolumnę źródłową i zmień nazwę nowej kolumny na nazwę kolumny źródłowej.
Mogą występować dodatkowe trudności, takie jak praca na wielu serwerach itp.
Zapoznaj się z poniższym artykułem, aby uzyskać instrukcje (przy użyciu ssms i T-sql). Te kroki są przeznaczone dla początkujących z mniejszą znajomością T-SQL.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
źródło
generuje skrypt dla wszystkich tabel z kluczem podstawowym = bigint, które nie mają zestawu tożsamości; to zwróci listę wygenerowanych skryptów z każdą tabelą;
źródło